Туда и обратно: задачка на числа с плавающей точкой (почти без подвоха)

????? ?????? ? ????, ??????? ?????????? ??????? ? ???????, ??? ????? ???? ?????????.

????, ? ??? ???? ??????????? ?????????, ??????? ???????? ????? ? ????????? ?????? ? ????, ? ????? ?????? ??? ??????. ? ???? ??????? ???? ???????????? ????? ? ?????? ??????. ??? ???????, ??? ??? ????? ??? ??? ????? ??????? (???????????? ?????? ?????? ?????):

void qu(double g)
{
char buf[2000];
sprintf(buf,"%lf\n", g);
fputs(buf,stdout);
double q = 0;
int n = sscanf(buf,"%lf",&q);
printf("Got back %d numbers = %lf\n\n", n, q);
}

??????: ??? ?????? ????? ????????? ?? ?????? ????????, ??? ???????? (??????? ?? ???????? ????????? ?????????? ??? ?????????????)?

----------------- ????? (????? ?? ??????, ????????, ????? ???????) ----------

??-?. ????? ????? ? ???? ?????? ?????????? ?? ??????????? ???????? ??????? ????? ? ????????? ?????? ? ????????? IEEE – ????????????? ? ??-????? (infinity & non-a-number/NAN). ??? ?????? ?????? ???? ???????, ??????? ????? ???????? ????????:

#include <windows.h>
#include <stdio.h>

int wmain(int argc, WCHAR* argv[])
{
float f0 = 0;
unsigned long nan[2]={0xffffffff, 0x7fffffff};
double g = *( double* )nan;
qu(g);

 nan[1] = 0xffffffff;
g = *( double* )nan;
qu(g);

 g = 5.0/f0;
qu(g);

 g = -5.0/f0;
qu(g);

 return 0;
}

? ????? ?????? ???? ????? ????????? ???:

1.#QNAN0 1.#QNAN0e+000
Got back 1 numbers = 1.000000

-1.#QNAN0 -1.#QNAN0e+000
Got back 1 numbers = -1.000000

1.#INF00 1.#INF00e+000
Got back 1 numbers = 1.000000

-1.#INF00 -1.#INF00e+000
Got back 1 numbers = -1.000000

???????????? ??????? ? ???, ??? ??? ???? ?? ?????????? ??? ?????????????, ? ?????? ??????? ?????? ? ???? ?? ???????? ??????? ?????????? ???????? ??????.

------------------------ ????? ?????? -------------------

Comments

  • Anonymous
    January 01, 2003
    Я написал это пронаблюдав как на это вполне серьезно напоролись... :-)

  • Anonymous
    January 01, 2003
    > А это в таком случае что? Задачка, развлекательная. > Тебе на заметку, ортодоксальные приверженцы > операционок называются одептами, через "о". > Это сленг, навроде твоего "мошенства". Спасибо, не знал. > Эльдар, ты чересчур болезненно > реагируешь на комментарии Да, пожалуй. Плохой день был, извини. Свои комментарии завтра потру, твои оставлю.

  • Anonymous
    July 26, 2006
    В libc понимает: http://www.calpoly.edu/cgi-bin/man-cgi?scanf+3

  • Anonymous
    July 26, 2006
    Ну, кто же теперь libc использует? Даже по умолчанию в VS использование DLL стоит...

  • Anonymous
    July 26, 2006
    Хотя надо будет проверить, интересно. Судя по документации, тоже не все возьмет.

  • Anonymous
    July 20, 2007
    Ну и при чем тут "числа с плавающей точкой"? Задача только к преобразованиям в строки и обратно относится. Я думал серьезное...

  • Anonymous
    July 27, 2007
    Очень верно что в начале программы подключена windows.h, так понятнее, на какой платформе ошибка происходит. BTW на линуксе (Ubuntu Breezy Badger amdx64) вывод такой: nan Got back 1 numbers = nan nan Got back 1 numbers = nan inf Got back 1 numbers = inf только чтобы программа правильно работала надо сделать s/unsigned long/unsigned int/ иначе вместо nan показывается 0.000000 с разрядностью надо тоже быть аккуратнее )

  • Anonymous
    July 28, 2007
    Объясняю. Линукс при том, что на этой платформе ошибки обнаружено не было. Поскольку я разрабатываю под обе операционки, проверил на обоих (Qnx под рукой не было, ее бы тоже протестировал). Именно потому я и указал подробно и дистрибутив и платформу. С наездом увы ты поспешил. То же относится и к разрядности -- небольшой штрих для устранения еще одного возможного подвоха. Если быть совсем строгим то следовало использовать uint32_t. Я вообще искренне полагал, что принято писать код, который максимально совместим для разных платформ. Это полезная привычка. Призываю проявить себя как инженера и вести конструктивную дискуссию, не уподобляясь одептам тех или иных операционок.

  • Anonymous
    July 30, 2007
    > Я не пишу код ради чистого искусства, а для конкретной цели. А это в таком случае что? http://blogs.technet.com/eldar/archive/2006/09/07/453123.aspx > Кстати, через "а" пишется. Спасибо, я в курсе. Тебе на заметку, ортодоксальные приверженцы операционок называются одептами, через "о". Это сленг, навроде твоего "мошенства". Эльдар, ты чересчур болезненно реагируешь на комментарии и перешел на личности. Нереспект.