Почему функция stl возвращает это двойное значение? - PullRequest
1 голос
/ 10 ноября 2011

Следующее утверждение терпит неудачу в RAD Studio 2010 (и, кстати, будет успешным в Visual Studio 2010):

double              d1 = 0.0104;
double              d2 = 0.0;
std::istringstream  ss("0.0104");
ss >> d2;
assert(d1 == d2);

Это меня немного удивило.Я проследил в оператор извлечения, чтобы увидеть, что происходит, дошел до dinkumware/xlocnum и не смог проследить дальше.

Может кто-нибудь сказать мне, почему __Stodx(... "0.0104") возвращает значение, незначительно отличающееся отdouble, инициализированный как 0.0104?

(я знаю, что некоторые значения не могут быть представлены точно в двоичном виде. Что я хочу знать, так это то, почему результирующие числа типа double содержат разные значения, чтобы я мог их понять.)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Здесь ответ на этот вопрос.

[29.17] Почему не работает сравнение с плавающей запятой?

Поскольку арифметика с плавающей запятойотличается от арифметики действительных чисел.

Итог: Никогда не используйте == для сравнения двух чисел с плавающей запятой.

Здесь ответ на вопрос «почему результирующие двойные числа содержат разные значения»

  1. d1 - точное представление констант, предоставляемое компилятором.
  2. d2 вычисляется во время преобразования (см. Пример strtod ), поэтому могут быть некоторые ошибки округления при работе с плавающей точкойрасчет как описано здесь и здесь
1 голос
/ 15 февраля 2012

Дорогой меня: компилятор и библиотека используют разные методы для преобразования строк в двойники, и без доступа к источнику компилятора никто не сможет рассказать вам, чем отличаются эти методы.

К сожалению, Me

...