Re[2]: Что за хрень творится (math.h)
От: Thermal Россия  
Дата: 16.10.06 07:26
Оценка:
Здравствуйте, volk, Вы писали:

V>Здравствуйте, Yozh_Programmer, Вы писали:


Y_P>>Почему этот код выдает такие результаты

Y_P>>1.99999999999999980000
Y_P>>2.00000000000000000000

V>Такое поведение является абсолютно нормальным (в том смысле, что его допускают все имеющие отношение к теме стандарты). Причин такому фокусу может быть мильон и вот одна из них.


V>Процессор умеет представлять вещественные числа в 80-битном формате. А вот если они выгружаются в память, то число будет усечено до 64 бит. Результат расчета зависит от того, было ли число сохранено и потом получено из памяти, или все вычисления были проделаны с привлечением только регистров процессора.


V>Где в твоей программе имеет место этот эффект и он ли это -- можно только гадать (или посмотреть ассемблерный листинг). Скорее всего, чудо случается при подготовке результирующей строчки в printf.



В связи с этим можно ли проблему свалить на оптимизацию?: В первый раз значение вычисляется, затем сливается в память, так как такой код встретиться снова, и следующий раз, вместо того, чтобы вычислять — просто загружает из памяти, но там уже урезанный до 64 бит результат.
Предпочитаю Виртуалу Реал. В Реале люблю Реальных Девушек.
Re[3]: Что за хрень творится (math.h)
От: volk  
Дата: 16.10.06 09:08
Оценка:
Здравствуйте, Thermal, Вы писали:

T>В связи с этим можно ли проблему свалить на оптимизацию?: В первый раз значение вычисляется, затем сливается в память, так как такой код встретиться снова, и следующий раз, вместо того, чтобы вычислять — просто загружает из памяти, но там уже урезанный до 64 бит результат.


Конечно нельзя. Тот сценарий, который я здесь привел -- это всего лишь одна из возможных причин. Кроме нее здесь еще упоминали сборс состояния сопроцессора при системных вызовах. Кажется, бывает еще нечто, что приводит к тому же эффекту -- сходу не помню.

В общем, если эта проблема мешает нормальной работе твоей программы, то свалить ее ни на что не удастся -- увы, это твоя ошибка.
Тот, кто желает, но не делает, распространяет чуму.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.