Здравствуйте, volk, Вы писали:
V>Здравствуйте, Yozh_Programmer, Вы писали:
Y_P>>Почему этот код выдает такие результаты Y_P>>1.99999999999999980000 Y_P>>2.00000000000000000000
V>Такое поведение является абсолютно нормальным (в том смысле, что его допускают все имеющие отношение к теме стандарты). Причин такому фокусу может быть мильон и вот одна из них.
V>Процессор умеет представлять вещественные числа в 80-битном формате. А вот если они выгружаются в память, то число будет усечено до 64 бит. Результат расчета зависит от того, было ли число сохранено и потом получено из памяти, или все вычисления были проделаны с привлечением только регистров процессора.
V>Где в твоей программе имеет место этот эффект и он ли это -- можно только гадать (или посмотреть ассемблерный листинг). Скорее всего, чудо случается при подготовке результирующей строчки в printf.
В связи с этим можно ли проблему свалить на оптимизацию?: В первый раз значение вычисляется, затем сливается в память, так как такой код встретиться снова, и следующий раз, вместо того, чтобы вычислять — просто загружает из памяти, но там уже урезанный до 64 бит результат.
Предпочитаю Виртуалу Реал. В Реале люблю Реальных Девушек.
Здравствуйте, Thermal, Вы писали:
T>В связи с этим можно ли проблему свалить на оптимизацию?: В первый раз значение вычисляется, затем сливается в память, так как такой код встретиться снова, и следующий раз, вместо того, чтобы вычислять — просто загружает из памяти, но там уже урезанный до 64 бит результат.
Конечно нельзя. Тот сценарий, который я здесь привел -- это всего лишь одна из возможных причин. Кроме нее здесь еще упоминали сборс состояния сопроцессора при системных вызовах. Кажется, бывает еще нечто, что приводит к тому же эффекту -- сходу не помню.
В общем, если эта проблема мешает нормальной работе твоей программы, то свалить ее ни на что не удастся -- увы, это твоя ошибка.
Тот, кто желает, но не делает, распространяет чуму.