Re[4]: Ага... Не забываем указывать флаг D3DCREATE_FPU_PRESE
От: max-megahertz  
Дата: 29.05.06 19:00
Оценка: 24 (1) +1
Subj, может еще кому пригодится
Ошибка вычисления double в .NET 2.0?
От: max-megahertz  
Дата: 29.05.06 16:50
Оценка:
Коллеги,

Замучился уже. Помогите! Всю жизнь (а точнее лет как 10) программировал на C++ и спокойно выслушивал крики "нового поколения программистов" про эффективность .NET. Вот решил "опробовать". Написал уже большой кусок кода, при отладке наткнулся:


            double hbs1 = 1.3999999761581421, r1 = 0.10000000000000001,
                     x1 = 1.2999999523162842;

            double tx2 = hbs1 - r - x1;


tx2 = 0.0

VisualStudio в окне Watch издевательски показывает, что hbs1 — (radius1 + x1) должно быть 0.000000023841857821338408. На старом добром С++ все считается верно. В чем проблема?!

VisualStudio, если это существенно 2005.

Заранее благодарю.
Re: Ошибка вычисления double в .NET 2.0?
От: _FRED_ Черногория
Дата: 29.05.06 17:00
Оценка:
Здравствуйте, max-megahertz, Вы писали:

MM>Коллеги,

MM>Замучился уже. Помогите! Всю жизнь (а точнее лет как 10) программировал на C++ и спокойно выслушивал крики "нового поколения программистов" про эффективность .NET. Вот решил "опробовать". Написал уже большой кусок кода, при отладке наткнулся:
MM>            double hbs1 = 1.3999999761581421, r1 = 0.10000000000000001,
MM>                     x1 = 1.2999999523162842;

MM>            double tx2 = hbs1 - r - x1;

MM>tx2 = 0.0
MM>VisualStudio в окне Watch издевательски показывает, что hbs1 — (radius1 + x1) должно быть 0.000000023841857821338408. На старом добром С++ все считается верно. В чем проблема?!
MM>VisualStudio, если это существенно 2005.

Неправда Ваша, у меня вот так (78,3 KB)
... << RSDN@Home 1.2.0 alpha rev. 650>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re: Ошибка вычисления double в .NET 2.0?
От: Streamer1 Украина  
Дата: 29.05.06 17:01
Оценка:
Здравствуйте, max-megahertz, Вы писали:

MM>Замучился уже.


MM>
MM>            double hbs1 = 1.3999999761581421, r1 = 0.10000000000000001,
MM>                     x1 = 1.2999999523162842;

MM>            double tx2 = hbs1 - r - x1;
MM>


MM>tx2 = 0.0


MM>VisualStudio в окне Watch издевательски показывает, что hbs1 — (radius1 + x1) должно быть 0.000000023841857821338408. На старом добром С++ все считается верно. В чем проблема?!


может быть здесь дело все в кривых именах переменных?

вот такой код дает 2.38418578213384E-08:
    double hbs1 = 1.3999999761581421D, r1 = 0.10000000000000001D,
        x1 = 1.2999999523162842D;
    double tx2 = hbs1 - r1 - x1;
    
    Console.WriteLine("val={0}", tx2.ToString());


в чем разница?
Тот кто говорит не знает, тот кто знает не говорит.
Re[2]: Ошибка вычисления double в .NET 2.0?
От: Streamer1 Украина  
Дата: 29.05.06 17:06
Оценка:
и такой тоже дает правильный результат:
         double hbs1 = 1.3999999761581421, r1 = 0.10000000000000001,
                x1 = 1.2999999523162842;
         double tx2 = hbs1 - r1 - x1;
         
                 Console.WriteLine("val={0}", tx2.ToString());


p.s.: ищите ошибку в именах
Тот кто говорит не знает, тот кто знает не говорит.
Re[2]: Ошибка вычисления double в .NET 2.0?
От: max-megahertz  
Дата: 29.05.06 17:32
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, max-megahertz, Вы писали:


MM>>Коллеги,

MM>>Замучился уже. Помогите! Всю жизнь (а точнее лет как 10) программировал на C++ и спокойно выслушивал крики "нового поколения программистов" про эффективность .NET. Вот решил "опробовать". Написал уже большой кусок кода, при отладке наткнулся:
_FR>
MM>>            double hbs1 = 1.3999999761581421, r1 = 0.10000000000000001,
MM>>                     x1 = 1.2999999523162842;

MM>>            double tx2 = hbs1 - r - x1;
_FR>

MM>>tx2 = 0.0
MM>>VisualStudio в окне Watch издевательски показывает, что hbs1 — (radius1 + x1) должно быть 0.000000023841857821338408. На старом добром С++ все считается верно. В чем проблема?!
MM>>VisualStudio, если это существенно 2005.

_FR>Неправда Ваша, у меня вот так (78,3 KB)


Мдааа.. В чистом проекте и правда посчиталось нормально... Ну тогда извиняйте, наверно мой косяк. Попробую найти или хотя-бы реализовать повторяемость на "чистом листе"...
Re: Ошибка вычисления double в .NET 2.0?
От: GlebZ Россия  
Дата: 29.05.06 17:36
Оценка:
Здравствуйте, max-megahertz, Вы писали:

Первое. Double в Net 8-байтовый. У него выделено 51 бит на мантиссу(чуть больше 15 символов). Соответсвенно, если у вас больше 15 символов, то информация теряется.
Второе. В том коде — все нормально. Символы как были double, так и остаются double (спецификация). Соответсвенно, либо у вас в коде ошибка, либо в дебаггере. Попробуйте дополнительно задать D в константах.
Re[3]: Ошибка вычисления double в .NET 2.0?
От: max-megahertz  
Дата: 29.05.06 17:43
Оценка:
Гхммм.. Методом исключения нашел, что в моей программе такое поведение начинает проявляться после инициализации DirectX.

После исполнения такого кода:


            double hbs1 = 1.3999999761581421, r1 = 0.10000000000000001, x1 = 1.2999999523162842;
            double tx2 = hbs1 - r1 - x1;

            device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParameters);

            double tx32 = hbs1 - r1 - x1;



tx2 = 0.000000023841857821338408, а tx32 = 0.0

Данная конкретная претензия к дот.нет вроде снимается. И появляется к DirectX Тьфу...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.