M­­ar­­­­k Ответов: 4

Как получается, что и float, и double могут хранить одинаковое количество десятичных знаков в C?


Это и есть код. (С)

float f  = 3.1415926535897932384626433832795;
double d = 3.1415926535897932384626433832795;
	
printf("float  = %.20f \n", f);
printf("double = %.20f \n", d);


Согласно статье в Википедии, double имеет точность в 2 раза большую, чем float. Но результат, который я получаю, таков.

float  = 3.14159274101257320000
double = 3.14159265358979310000


Нет большой разницы между float и double, за исключением того, что double округлил последнюю цифру.

Как это возможно, если float имеет только 7-значную точность ?


Что я уже пробовал:

float f  = 3.1415926535897932384626433832795;
double d = 3.1415926535897932384626433832795;
	
printf("float  = %.20f \n", f);
printf("double = %.20f \n", d);

4 Ответов

Рейтинг:
32

Jochen Arndt

Вы указали, что должны быть напечатаны 20 цифр после десятичной точки. Так оно и есть. Но это не значит, что эти цифры верны и значимы.

Вы также заметили, что последние четыре цифры-это нули. Это потому, что а double имеет такую точность, и дополнительные цифры устанавливаются в ноль с помощью printf() функция.

Причина, по которой оба напечатанных значения имеют эти 16 цифр, заключается в том, что printf() функция только поддерживает double значения как аргументы с плавающей запятой и передаются float аргументы преобразуются в double за кулисами. Компилятор обрабатывает его следующим образом:

printf("float  = %.20f \n", (double)f);

Результирующие значения, напечатанные с соответствующим разрешением, являются:
input  = 3.1415926535897932384626433832795
double = 3.14159265358979311
float  = 3.141592741
Как вы можете видеть, float отличается от входного сигнала на 8-м разряде и double на 17-й цифре.


Jochen Arndt

С чего бы это?
Я уже знаю о стандарте IEEE 754.

Рейтинг:
23

Gerry Schmitz

Как это возможно, если плыть имеет только один Точность 7 цифр ?

Согласно статье в Википедии, double имеет точность в 2 раза большую, чем float. Но результат, который я получаю, таков.

плыть = 3.14159274101257320000
двойной = 3.14159265358979310000


(Он по-прежнему имеет только "7 цифр точности").


M­­ar­­­­k

О, я этого не видел. Но откуда взялись эти неправильные цифры ? Разве они не должны быть 00000 после 7 - й позиции в поплавке?

Gerry Schmitz

Они только "неправильные", если вы используете их :)

Вы "попросили" 20; отображаемый результат "вычисляется".

Проверьте "десятичный" тип: 28-29 значащих цифр.

Рейтинг:
16

Patrice T

Цитата:
Но откуда взялись эти неправильные цифры ? Разве они не должны быть 00000 после 7 - й позиции в поплавке?

Это происходит потому, что значения хранятся внутри как суб-степени 2, и это значение не является точным.
Видеть: Пи и Е в двоично - исследовать Бинарные[^]


Рейтинг:
0

M­­ar­­­­k

Я прочел ее, и она не отвечает на мой вопрос. Даже ответ на этот вопрос говорит, что float имеет ~7 цифр, а double - ~16 цифр. Но в приведенном выше коде и float, и double оказались 16-значными.