Spec-Zone.ru › C

Переменная с плавающей точкой

Позволяет использовать значения с плавающей точкой непосредственно в выражениях.

Синтаксис

Константа с плавающей точкой — это выражение, не являющееся lvalue, имеющее вид:

мантисса порядок (необязательно) суффикс (необязательно)

Где мантисса имеет вид

целое число (необязательно) . (необязательно) дробная часть (необязательно)

Порядок имеет вид

e | E знак порядка (необязательно) последовательность цифр (1)
p | P знак порядка (необязательно) последовательность цифр (2) (с C99)
1) Синтаксис порядка для десятичной константы с плавающей точкой
2) Синтаксис порядка для шестнадцатеричной константы с плавающей точкой

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

(с C23)

Объяснение

Если мантисса начинается с последовательности символов 0x или 0X, константа с плавающей точкой является шестнадцатеричной константой с плавающей точкой. В противном случае это десятичная константа с плавающей точкой.

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

double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0
(с C99)

Для десятичной константы с плавающей точкой мантисса интерпретируется как десятичное рациональное число, а последовательность цифр порядка интерпретируется как целая степень 10, к которой должна быть масштабирована мантисса.

double d = 1.2e3; // decimal fraction 1.2 scaled by 10^3, that is 1200.0

Суффиксы

Константа с плавающей точкой без суффикса имеет тип double. Если суффикс представляет собой букву f или F, константа с плавающей точкой имеет тип float. Если суффикс представляет собой букву l или L, константа с плавающей точкой имеет тип long double.

Если реализация предопределяет макрос __STDC_IEC_60559_BFP__, дополнительно поддерживаются следующие суффиксы и соответствующие константы с плавающей точкой:

  • если суффикс представляет собой df или DF, константа с плавающей точкой имеет тип _Decimal32;
  • если суффикс представляет собой dd или DD, константа с плавающей точкой имеет тип _Decimal64;
  • если суффикс представляет собой dl или DL, константа с плавающей точкой имеет тип _Decimal128.

Суффиксы для десятичных типов с плавающей точкой недопустимы в шестнадцатеричных константах с плавающей точкой.

(с C23)

Необязательные части

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

double x = 1e0; // floating-point 1.0 (period not used)

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

double x = 1.; // floating-point 1.0 (fractional part optional)
double y = .1; // floating-point 0.1 (whole-number part optional)

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

(с C99)

Представимые значения

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

Все константы с плавающей точкой одного исходного вида преобразуются в один и тот же внутренний формат с тем же значением. Константы с плавающей точкой различных исходных видов, например, 1.23 и 1.230, не обязательно преобразуются в один и тот же внутренний формат и значение.

Константы с плавающей точкой могут преобразовываться в более широкий диапазон и точность, чем указано их типом, если указано в FLT_EVAL_METHOD. Например, константа 0.1f может действовать так, как будто это 0.1L в выражении.

Результат вычисления шестнадцатеричной константы с плавающей точкой, если FLT_RADIX равно 2, — это точное значение, представленное константой с плавающей точкой, корректно округлённое до целевого типа.

(с C99)

Константы с плавающей точкой десятичного типа, имеющие одинаковое численное значение \(\small x\)x, но разные квантовые порядки, например, 1230.dd, 1230.0dd, и 1.23e3dd, имеют различимые внутренние представления.

Квантовый порядок \(\small q\)q константы с плавающей точкой десятичного типа определяется так, что \(\small 10^q\)10q представляет 1 в разряде последней цифры мантиссы, когда это возможно. Если квантовый порядок \(\small q\)q и коэффициент \(\small c = x\cdot 10^{-q}\)c=x·10-q, определённые выше, не могут быть точно представлены в типе константы с плавающей точкой, \(\small q\)q увеличивается по мере необходимости в пределах предела типа, а \(\small c\)c уменьшается соответственно, с необходимым округлением. Округление может привести к нулю или бесконечности. Если (возможно, округлённое) \(\small c\)c всё ещё выходит за пределы допустимого диапазона после того, как \(\small q\)q достигает максимального значения, полученная константа с плавающей точкой имеет значение положительной бесконечности.

(с C23)

Примечания

Направление округления по умолчанию и точность действуют при преобразовании констант с плавающей точкой во внутренние представления, и исключения с плавающей точкой не генерируются даже если #pragma STDC FENV_ACCESS в действии (для преобразования строк в числа во время выполнения, strtod может быть использован). Обратите внимание, что это отличается от арифметических константных выражений с плавающей точкой.

Регистр букв в константах с плавающей точкой не учитывается, за исключением того, что прописные и строчные буквы не могут быть использованы одновременно в суффиксах для десятичных типов с плавающей точкой(с C23): 0x1.ep+3 и 0X1.EP+3 представляют одно и то же значение с плавающей точкой 15.0.

Десятичная точка, указанная setlocale не влияет на синтаксис констант с плавающей точкой: десятичная точка всегда является точкой.

В отличие от целых чисел, не каждое значение с плавающей точкой может быть представлено непосредственно с помощью десятичной или даже шестнадцатеричной(с C99) синтаксической константы: макросы NAN и INFINITY, а также функции, такие как nan предлагают способы получения этих специальных значений(с C99). Обратите внимание, что 0x1.FFFFFEp128f, который может показаться IEEE float NaN, фактически переполняется до бесконечности в этом формате.

Нет отрицательных констант с плавающей точкой; выражение, такое как -1.2 является унарным минусом арифметического оператора, применённым к константе с плавающей точкой 1.2. Обратите внимание, что специальное значение отрицательный ноль может быть получено с помощью -0.0.

Пример

#include <stdio.h>
 
int main(void)
{
    printf("15.0     = %a\n", 15.0);
    printf("0x1.ep+3 = %f\n", 0x1.ep+3);
 
    // Constants outside the range of type double.
    printf("+2.0e+308 --> %g\n",  2.0e+308);
    printf("+1.0e-324 --> %g\n",  1.0e-324);
    printf("-1.0e-324 --> %g\n", -1.0e-324);
    printf("-2.0e+308 --> %g\n", -2.0e+308);
}

Вывод:

15.0     = 0x1.ep+3
0x1.ep+3 = 15.000000
+2.0e+308 --> inf
+1.0e-324 --> 0
-1.0e-324 --> -0
-2.0e+308 --> -inf

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2023):
    • 6.4.4.2 Константы с плавающей точкой (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 6.4.4.2 Константы с плавающей точкой (стр.: 47-48)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 6.4.4.2 Константы с плавающей точкой (стр.: 65-66)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 6.4.4.2 Константы с плавающей точкой (стр.: 57-58)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
    • 3.1.3.1 Константы с плавающей точкой

См. также

Документация C++ для Константа с плавающей точкой

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/floating_constant

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API