Сложение 2 double
От: Аноним  
Дата: 26.07.11 08:30
Оценка: :)
Есть простейший код
Компилятор-Visual Studio 2008 Express Edition
double a = 12.256789;
double b = 0.000001;
a+=b;
При пустом проекте а равняется 12.25678(9)(что мне и надо)
В большом проекте почему-то тот же код дает а==12.256790161132812
Опции компилятора какие смотреть или что?
Re: Сложение 2 double
От: Кодёнок  
Дата: 26.07.11 08:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Опции компилятора какие смотреть или что?


Если тебе нужна такая предсказуемость, тебе нужен decimal, а не double.

Дело может быть в опции /fp
/fp:<except[-]|fast|precise|strict> choose floating-point model:
    except[-] - consider floating-point exceptions when generating code
    fast - "fast" floating-point model; results are less predictable
    precise - "precise" floating-point model; results are predictable
    strict - "strict" floating-point model (implies /fp:except)
Re: Сложение 2 double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 26.07.11 08:51
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>При пустом проекте а равняется 12.25678(9)(что мне и надо)

А>В большом проекте почему-то тот же код дает а==12.256790161132812
А>Опции компилятора какие смотреть или что?

В большом проекте видимо используются какие-то функции, которые изменяют режим работы сопроцессора. Опять же, как просматривали значение? Может, отладчик (или поток вывода) по другому отформатировал.
Маньяк Робокряк колесит по городу
Re[2]: Сложение 2 double
От: AlexNoo  
Дата: 26.07.11 08:56
Оценка:
Кё> precise — "precise" floating-point model; results are predictable
В том то и дело,что и там и там precise стоит

M>В большом проекте видимо используются какие-то функции, которые изменяют режим работы сопроцессора.

Кто-нибудь встречал такое? Как с этим бороться?

>Опять же, как просматривали значение? Может, отладчик (или поток вывода) по другому отформатировал.

И отладчиком и потоком вывода-такая вот неточность.Я знаю что особенной точности от того-же double не дождаться, но не до такой же степени
Re[3]: Сложение 2 double
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 26.07.11 09:01
Оценка:
Здравствуйте, AlexNoo, Вы писали:

M>>В большом проекте видимо используются какие-то функции, которые изменяют режим работы сопроцессора.

AN>Кто-нибудь встречал такое? Как с этим бороться?
Я натыкался на подобное довольно давно, когда пользовался борландовским компилятором. Как боролся — забил вроде, не критично было.
Маньяк Робокряк колесит по городу
Re[3]: Сложение 2 double
От: mpn-2005  
Дата: 26.07.11 09:13
Оценка:
Здравствуйте, AlexNoo, Вы писали:

Кё>> precise — "precise" floating-point model; results are predictable

AN>В том то и дело,что и там и там precise стоит

M>>В большом проекте видимо используются какие-то функции, которые изменяют режим работы сопроцессора.

AN>Кто-нибудь встречал такое? Как с этим бороться?

>>Опять же, как просматривали значение? Может, отладчик (или поток вывода) по другому отформатировал.

AN>И отладчиком и потоком вывода-такая вот неточность.Я знаю что особенной точности от того-же double не дождаться, но не до такой же степени

Что-то совсем нечисто.
double должен давать точность 15-16 десятичных знаков.
Попробовал на компиляторее gcc (под рукой нету другого сишного).

double a = 12.256789;
double b = 0.000001;
a+=b;
printf("%.13f\n", a);

результат 12.256790000000

может стоит попробовать присвоение таким образом:
double a = (double)12.256789;
double b = (double)0.000001;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Сложение 2 double
От: AlexNoo  
Дата: 26.07.11 09:17
Оценка:
M2> результат 12.256790000000

Дак вот и говорю- в пустом проекте все ОК

M2>может стоит попробовать присвоение таким образом:

M2> double a = (double)12.256789;
M2> double b = (double)0.000001;
да всяко пробовал-(double)x и double(x).
Re[5]: Сложение 2 double
От: mpn-2005  
Дата: 26.07.11 09:21
Оценка:
Здравствуйте, AlexNoo, Вы писали:

M2>>может стоит попробовать присвоение таким образом:

M2>> double a = (double)12.256789;
M2>> double b = (double)0.000001;
AN>да всяко пробовал-(double)x и double(x).

А результат такого
double a = (float)12.256789;
double b = (float)0.000001;

даёт 12.256790161132812 или что-то другое?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Сложение 2 double
От: mpn-2005  
Дата: 26.07.11 09:24
Оценка: 3 (1)
Здравствуйте, AlexNoo, Вы писали:


M2>> результат 12.256790000000


AN>Дак вот и говорю- в пустом проекте все ОК


M2>>может стоит попробовать присвоение таким образом:

M2>> double a = (double)12.256789;
M2>> double b = (double)0.000001;
AN>да всяко пробовал-(double)x и double(x).

нашёл на одном форуме странность похожую:

Нашел, что точность портится изза использования Managed DirectX.
Если кому интересно, вот статья: http://blogs.msdn.com/tmiller/archive/2004/06/01/145596.aspx
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Сложение 2 double
От: MasterZiv СССР  
Дата: 26.07.11 09:25
Оценка:
On 26.07.2011 12:35, Кодёнок wrote:

> Если тебе нужна такая предсказуемость, тебе нужен decimal, а не double.

>

Да только нет такого в С++.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: Сложение 2 double
От: AlexNoo  
Дата: 26.07.11 09:33
Оценка:
M2>нашёл на одном форуме странность похожую:

M2>Нашел, что точность портится изза использования Managed DirectX.

M2>Если кому интересно, вот статья: http://blogs.msdn.com/tmiller/archive/2004/06/01/145596.aspx

DirectX пользую,но не managed вроде как...
Re[7]: Сложение 2 double
От: K13 http://akvis.com
Дата: 26.07.11 09:38
Оценка:
M2>>Нашел, что точность портится изза использования Managed DirectX.
M2>>Если кому интересно, вот статья: http://blogs.msdn.com/tmiller/archive/2004/06/01/145596.aspx

AN>DirectX пользую,но не managed вроде как...


У нас такое лечили передачей флага в инициализацию DirectX (чтобы эта сволочь не выставляла сопроцессор в режим одинарной точности).
Re[8]: Сложение 2 double
От: AlexNoo  
Дата: 26.07.11 09:46
Оценка:
K13>У нас такое лечили передачей флага в инициализацию DirectX (чтобы эта сволочь не выставляла сопроцессор в режим одинарной точности).

Всем спасибо за наводку-в настройках директа floating point mode стояло fastest-кто ж знал,что на весь код проекта это отразится... Век живи-век учись
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.