Переменная с плавающей точкой
Позволяет использовать значения с плавающей точкой непосредственно в выражениях.
Синтаксис
Константа с плавающей точкой — это выражение, не являющееся lvalue, имеющее вид:
| мантисса порядок (необязательно) суффикс (необязательно) |
Где мантисса имеет вид
целое число
(необязательно)
.
(необязательно)
дробная часть
(необязательно)
|
Порядок имеет вид
e | E
знак порядка
(необязательно)
последовательность цифр
|
(1) | |
p | P
знак порядка
(необязательно)
последовательность цифр
|
(2) | (с C99) |
|
Можно вставить необязательные одинарные кавычки ( |
(с C23) |
Объяснение
|
Если мантисса начинается с последовательности символов Для шестнадцатеричной константы с плавающей точкой мантисса интерпретируется как шестнадцатеричное рациональное число, а последовательность цифр порядка интерпретируется как целая степень 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.
|
Если реализация предопределяет макрос
Суффиксы для десятичных типов с плавающей точкой недопустимы в шестнадцатеричных константах с плавающей точкой. |
(с 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)
|
Для шестнадцатеричных констант с плавающей точкой порядок не является необязательным, чтобы избежать неоднозначности, возникающей из-за того, что суффикс |
(с C99) |
Представимые значения
Результат вычисления константы с плавающей точкой — это либо ближайшее представимое значение, либо большее или меньшее представимое значение, непосредственно прилегающее к ближайшему представимому значению, выбранное определённым образом (другими словами, направление округления по умолчанию при переводе определяется реализацией).
Все константы с плавающей точкой одного исходного вида преобразуются в один и тот же внутренний формат с тем же значением. Константы с плавающей точкой различных исходных видов, например, 1.23 и 1.230, не обязательно преобразуются в один и тот же внутренний формат и значение.
|
Константы с плавающей точкой могут преобразовываться в более широкий диапазон и точность, чем указано их типом, если указано в Результат вычисления шестнадцатеричной константы с плавающей точкой, если |
(с C99) |
|
Константы с плавающей точкой десятичного типа, имеющие одинаковое численное значение \(\small x\)x, но разные квантовые порядки, например, Квантовый порядок \(\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