Туда и обратно: задачка на числа с плавающей точкой (почти без подвоха)
????? ?????? ? ????, ??????? ?????????? ??????? ? ???????, ??? ????? ???? ?????????.
????, ? ??? ???? ??????????? ?????????, ??????? ???????? ????? ? ????????? ?????? ? ????, ? ????? ?????? ??? ??????. ? ???? ??????? ???? ???????????? ????? ? ?????? ??????. ??? ???????, ??? ??? ????? ??? ??? ????? ??????? (???????????? ?????? ?????? ?????):
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.0000001.#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+3Anonymous
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 > Кстати, через "а" пишется. Спасибо, я в курсе. Тебе на заметку, ортодоксальные приверженцы операционок называются одептами, через "о". Это сленг, навроде твоего "мошенства". Эльдар, ты чересчур болезненно реагируешь на комментарии и перешел на личности. Нереспект.