Для вашего конкретного примера да, двоичное представление кодируется во время компиляции. Вероятно, он вызывает библиотеку C (atod, sscanf, etC), и то, что происходит в этой библиотеке с усечением или округлением, происходит. И компиляторы «функции» или «правила» для того, что он делает, не обязательно являются одними и теми же правилами выполнения, которые происходят, когда вы делаете то же самое. Вы никогда не должны проверять эквивалентность с плавающей точкой в любом случае, но если вы должны взять значение времени компиляции, а затем подать программу в строку и преобразовать эту среду выполнения (скажем, вы передаете значение 4.5632 в командной строке и используете один из вызовов библиотеки) вы не обязательно получите одинаковое значение с плавающей запятой. Я видел, что компиляторы (gcc и т. Д.) Выполняют очень плохую работу с константами времени компиляции, поэтому, как правило, для такого числа, как ваше (не так много в мантиссе), я предпочитаю точность:
double d; int a;
a 45632;
d = a;
d/=10000;
И даже если он оптимизирует его, он стремится получить лучший, более точный ответ.
Вы выполняете риск ошибки аппаратного обеспечения + OS в int для двойного преобразования, Хаузер сделал несколько комментариев о ошибках FPU, которые стремятся быть в int для float и float для операций int. Даже если во время компиляции я бы предположил, что компилятор буквально сделает два int для float, тогда разделите, а не строку, чтобы плавать напрямую, как ваш код.
Прошло несколько лет с тех пор, как я продемонстрировал все это, возможно, компиляторы стали лучше (сомнительно). Надеемся, что оборудование стало лучше (вероятно, очень редко можно было найти fpu, без труда найти ошибки).
Компьютеров не «подцепить» бинарное представления - аппаратные дизайнеров и компиляторы делают. Взгляните на [этот стандарт] (http://en.wikipedia.org/wiki/IEEE_754-2008). – dasblinkenlight