Вопрос по c++, double, floating-point, numbers – c / c ++ нотация двойных значений с плавающей точкой

0

Какие'Нотация для значений с плавающей запятой двойной точности в C / C ++?

0,5 представляет значение типа double или float? I '

Я уверен, что 2.0f анализируется как число с плавающей запятой, а 2.0 - как двойное, но как насчет .5?

http://c.comsci.us/etymology/literals.html

Хорошо, может быть, этоэто не так очевидно. Тем не менее, ноль перед десятичным знаком необязателен почти во всех языках. Даже при наборе цифр на карманных калькуляторах :) leemes
Почему должен.5 против.5f относиться иначе2.0 против?2.0f leemes
@leemes да, в большинстве случаев вы можете опустить суффикс f, когда инициализируете переменную с плавающей запятой литералом, но не всегда, смотрите мой ответ ниже. aka.nice
Но обратите внимание: без десятичного знака он становится целочисленным литералом. Суффиксf тогда незаконно ... Также обратите внимание, что в большинстве случаев вы ненужно добавитьfнапример вfloat x = .5;, Компилятор будет относиться к нему как к числу с плавающей точкой. (На самом деле, это двойная константа, назначенная для числа с плавающей запятой, но преобразование выполняется во время компиляции, поэтому она выдает тот же программный код, что и дляf добавлено.) Если значение является целым, вы можете даже опустить десятичный знак. Тем не менее, это становится опасным, еслии плавающие и двойные принимаются в контексте, например, по перегрузке функций и т. д. leemes

Ваш Ответ

2   ответа
1

инициализация числа с плавающей запятой с двойной константой может привести к другому результату (то есть накопить 2 ошибки округления), чем инициализация с помощью константы с плавающей запятой.

Вот пример:

#include <stdio.h>
int main() {
    double d=8388609.499999999068677425384521484375;
    float f1=8388609.499999999068677425384521484375f;
    float f2=8388609.499999999068677425384521484375;
    float f3=(float) d;
    printf("f1=%f f2=%f f3=%f\n",f1,f2,f3);
}
</stdio.h>

с gcc 4.2.1 i686 получаю

f1=8388609.000000 f2=8388610.000000 f3=8388610.000000

Константа находится точно в базе 2:

100000000000000000000001.011111111111111111111111111111

Базовое представление 2 требует 54 бита, двойное - только 53. Поэтому при преобразовании в двойное оно округляется до ближайшего двойного, привязывается к четному, таким образом:

100000000000000000000001.10000000000000000000000000000

Базовое представление 2 требует 25 битов, у float только 24, так что если вы конвертируете это число в число с плавающей точкой, то произойдет еще одно округление до ближайшего числа с плавающей точкой, привязанное к четному, таким образом:

100000000000000000000010.

Если вы преобразуете первое число непосредственно в число с плавающей точкой, единичное округление будет другим:

100000000000000000000001.

Как мы видим, при инициализации f2 gcc преобразует десятичное представление в double, а затем в число с плавающей точкой (было бы интересно проверить, определяется ли поведение стандартом).

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

Тот'хороший пример Harald Brendel
8

А вот ссылка на справочный документ:http://en.cppreference.com/w/cpp/language/floating_literal

@NT_SYSTEM Это "буквальные числа " о чем стоит прочитать Я думаю, что вы найдете некоторые полезные ссылки на Google. leemes
У меня нетЯ видел что-нибудь упомянутое, знаете ли вы хороший список обозначений переменных? NT_SYSTEM
@leemes Хорошо, спасибо. NT_SYSTEM

Похожие вопросы