Я прочитал книгу C Primer Plus и добрался до этого примера
#include <stdio.h>
int main(void)
{
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.32e-5;
printf("%f can be written %e\n", aboat, aboat);
printf("%f can be written %e\n", abet, abet);
printf("%f can be written %e\n", dip, dip);
return 0;
}
После того, как я запустил это на своем macbook, я был в шоке от результата:
32000.000000 can be written 3.200000e+04
2140000000.000000 can be written 2.140000e+09
2140000000.000000 can be written 2.140000e+09
Итак, я осмотрелся и обнаружил, что правильный формат для отображения long double — использовать %Lf
. Однако я до сих пор не могу понять, почему я получил двойное значение abet
вместо того, что получил при запуске на Cygwin, Ubuntu и < em>iDeneb, что примерно
-1950228512509697486020297654959439872418023994430148306244153100897726713609
013030397828640261329800797420159101801613476402327600937901161313172717568.0
00000 can be written 2.725000e+02
Любые идеи?
otool -L
в моем исполняемом файле сообщает мне, что он работает с /usr/lib/libSystem.B.dylib версии 111.1.4; это библиотека, которая предоставляетprintf
. Если у вас такая же версия этой библиотеки, вы должны получить тот же ответ. - person Jason Orendorff   schedule 22.11.2009printf()
' неправильный спецификатор формата для аргументов (или неправильные аргументы для спецификатора формата), вы вызываете "неопределенное" поведение; то, что вы видите, является результатом этого. - person Jonathan Leffler   schedule 22.11.2009