c / c ++ нотация двойных значений с плавающей точкой

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

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

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

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

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

Ответы на вопрос(2)

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

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

инициализация числа с плавающей запятой с двойной константой может привести к другому результату (то есть накопить 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 Brendel20 июн. 2013 г., 23:39
Тот'хороший пример

Ваш ответ на вопрос