2012-08-06 3 views
0

Когда я сохраняю значение поплавка в 12 знаков после запятой после шестидесятизначных мест, он показывает фиксированное значение. Если это значение мусора, оно должно быть разным для разных компиляторов, но когда я увидел результат в моя книга и попробовал это практически, они оба имеют одинаковые результаты.Значение поплавка с фиксированным значением

#include <stdio.h> 

int main(void) 
{ 
    float a = 1.234567890000; 

    printf("%.12f\n", a); 
    return 0; 
} 

OUTPUT:

1.234567880630 // In my book it also represents same output. 
+3

Что вы хотите сказать? Почему ваш результат не соответствует вашим данным? Поскольку вы вводите ввод в качестве базы 10, но компьютер хранит его в качестве базы два, и не хватает разрешения в 'float', чтобы получить все двенадцать знаков после запятой точно. –

+1

Обратите внимание, что вы начинаете с букв 'double', конвертируете его в' float' для хранения и затем конвертируете обратно в 'double' для печати. –

ответ

0

поплавок (в большинстве систем) хранит это значение в 32 битах, причем эти биты разделены между знаком, показателем и «мантиссой» (основная частью стоимости) это дает от 7 до 8 цифр десятичной точности для большинства значений, что значительно меньше 12 цифр, на которые вы смотрите.

double использует 64 бита и дает 15-16 цифр точности для большинства значений.

Вы получаете нечетные значения вокруг 7-9-й цифры, потому что ваш компилятор должен округлить значение, чтобы сохранить его. Методы округления довольно стандартизированы, поэтому компиляторы обычно дают одинаковые округленные результаты.

Обратите внимание, что C/C++ обычно требует, чтобы компиляторы предоставляли «минимальные» размеры, однако значения могут храниться в более крупном хранилище, например, в регистры CPU, поэтому ваш миледж будет отличаться от бит с низким значением.

3

Если это значение для мусора, то оно должно быть разным для разных компиляторов, но когда я увидел результат в своей книге и попробовал его практически, оба они имеют одинаковые результаты.

Существует очень хороший шанс, что ваш компилятор и книга, которую вы используете как использовать IEEE 754 стандарты для чисел с плавающей точкой, и имеет аналогичные mechansims для обработки значений. Таким образом, они, вероятно, получат тот же ответ, что и многие другие компиляторы и системы.

Основная проблема заключается в how floating point values are stored и функции. Недостаточно точности в 32-битном значении float, чтобы точно представлять ваши 12 десятичных разрядов, поэтому вы получаете другой результат, чем вы ввели.

1

Ожидайте компиляторы для реализации стандарта IEEE 754 для чисел с плавающей точкой. Для float (бинарные 32 бита) есть 23 бита для цифр и 1 для знака. Это дает вам десятичные цифры 7.x. Итак, что вы видите, правильно.

Если вам нужна более высокая точность использования double, которая использует 52 бит для цифры и дает вам точность в 34 цифры.

1

Если вы используете плавающий объект, вы также можете найти эту статью для просветления, избавив вас от многих неожиданностей: What Every Computer Scientist Should Know About Floating-Point Arithmetic.

Помните, что в отличие от математики 10 раз 0,1 вряд ли когда-либо 1.

Смежные вопросы