У меня есть этот код:Почему это сравнение с нолем работает неправильно?
double A = doSomethingWonderful(); // same as doing A = 0;
if(A == 0)
{
fprintf(stderr,"A=%llx\n", A);
}
и этот вывод:
A=7f35959a51c0
, как это возможно?
Я проверил значение 7f35959a51c0 и, похоже, что-то вроде 6.91040329973658785751176861252E-310, который очень мал, но не равен нулю.
EDIT:
Хорошо, я понял, что этот способ печати шестнадцатеричного значения для дубля не работает. Мне нужно найти способ печати байтов двойника.
После комментариев я изменил мой код:
A = doSomethingWonderful();// same as doing A = 0;
if(A == 0)
{
char bytes[8];
memcpy(bytes, &A, sizeof(double));
for(int i = 0; i < 8; i++)
fprintf(stderr," %x", bytes[i]);
}
и я получаю этот выход:
0 0 0 0 0 0 0 0
Итак, наконец, кажется, что сравнение работает правильно, но я делаю плохую печать.
Возможный дубликат [? Насколько опасно для сравнения значений с плавающей точкой] (http://stackoverflow.com/questions/10334688/how- опасные-это-сравнить-с плавающей точкой) – HadeS
@ HadeS не является дубликатом, я прекрасно знаю, что это опасно. :) – HAL9000
Вы имели в виду использовать% llx, а не% f для печати значения? AFAIK с использованием% llx для печати double - это неопределенное поведение. –