ilogb, ilogbf, ilogbl
Defined in header <math.h> |
||
|---|---|---|
int ilogbf( float arg ); |
(1) | (since C99) |
int ilogb( double arg ); |
(2) | (since C99) |
int ilogbl( long double arg ); |
(3) | (since C99) |
Defined in header <tgmath.h> |
||
#define ilogb( arg ) |
(4) | (since C99) |
Defined in header <math.h> |
||
#define FP_ILOGB0 /*implementation-defined*/ |
(5) | (since C99) |
#define FP_ILOGBNAN /*implementation-defined*/ |
(6) | (since C99) |
arg, и возвращает его как целое число со знаком. arg имеет тип long double, вызывается ilogbl. В противном случае, если arg имеет целочисленный тип или тип double, вызывается ilogb. В противном случае, вызывается ilogbf.Формально, смещённый экспонент — это целая часть logr|arg| как значение целого числа со знаком для ненулевого arg, где r является FLT_RADIX.
Параметры
| arg | - | значение с плавающей запятой |
Возвращаемое значение
Если ошибки не произошли, смещённый экспонент arg возвращается как значение signed int.
Если arg равно нулю, возвращается FP_ILOGB0.
Если arg бесконечен, возвращается INT_MAX.
Если arg — NaN, возвращается FP_ILOGBNAN.
Если правильный результат больше INT_MAX или меньше INT_MIN, возвращаемое значение не определено, и может произойти ошибка домена или ошибка диапазона.
Обработка ошибок
Ошибки сообщаются в соответствии со спецификацией в math_errhandling.
Ошибка домена или ошибка диапазона может произойти, если arg равно нулю, бесконечен или NaN.
Если правильный результат больше INT_MAX или меньше INT_MIN, может произойти ошибка домена или ошибка диапазона.
Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559),
- Если правильный результат больше
INT_MAXили меньшеINT_MIN, поднимаетсяFE_INVALID. - Если
argравно ±0, ±∞ или NaN, поднимаетсяFE_INVALID. - Во всех остальных случаях результат точный (
FE_INEXACTникогда не поднимается), и текущий режим округления игнорируется.
Примечания
Если arg не равно нулю, бесконечности или NaN, возвращаемое значение точно эквивалентно (int)logb(arg).
POSIX требует, чтобы произошла ошибка домена, если arg равно нулю, бесконечности, NaN или если правильный результат находится вне диапазона int.
POSIX также требует, чтобы в системах, совместимых с XSI, возвращаемое значение, когда правильный результат больше INT_MAX было INT_MAX, и возвращаемое значение, когда правильный результат меньше INT_MIN было INT_MIN.
Правильный результат может быть представлен как int на всех известных реализациях. Для переполнения INT_MAX должно быть меньше LDBL_MAX_EXP*log2(FLT_RADIX) или INT_MIN должно быть больше LDBL_MIN_EXP-LDBL_MANT_DIG)*log2(FLT_RADIX).
Значение экспоненты, возвращаемое ilogb, всегда на 1 меньше, чем экспонента, возвращаемая frexp, из-за различных требований нормализации: для экспоненты e, возвращаемой ilogb, |arg*r-e| находится между 1 и r (обычно между 1 и 2), но для экспоненты e возвращаемой frexp, |arg*2-e| находится между 0.5 и 1.
Пример
#include <stdio.h>
#include <math.h>
#include <float.h>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
int main(void)
{
double f = 123.45;
printf("Given the number %.2f or %a in hex,\n", f, f);
double f3;
double f2 = modf(f, &f3);
printf("modf() makes %.0f + %.2f\n", f3, f2);
int i;
f2 = frexp(f, &i);
printf("frexp() makes %f * 2^%d\n", f2, i);
i = ilogb(f);
printf("logb()/ilogb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
// error handling
feclearexcept(FE_ALL_EXCEPT);
printf("ilogb(0) = %d\n", ilogb(0));
if(fetestexcept(FE_INVALID)) puts(" FE_INVALID raised");
}Возможный вывод:
Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
ilogb(0) = -2147483648
FE_INVALID raisedСсылки
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.12/8 Математика <math.h> (стр: 232)
- 7.12.6.5 Функции ilogb (стр: 244)
- 7.25 Универсальная математика <tgmath.h> (стр: 373-375)
- F.10.3.5 Функции ilogb (стр: 521)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.12/8 Математика <math.h> (стр: 213)
- 7.12.6.5 Функции ilogb (стр: 224-225)
- 7.22 Универсальная математика <tgmath.h> (стр: 335-337)
- F.9.3.5 Функции ilogb (стр: 458)
См. также
|
(C99)(C99) |
разбивает число на мантиссу и степень 2 (функция) |
|
(C99)(C99)(C99) |
извлекает экспоненту данного числа (функция) |
|
(C99)(C99)(C99)(C99)(C99)(C99) |
вычисляет эффективно число, умноженное на FLT_RADIX в степени (функция) |
Документация C++ для ilogb |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/numeric/math/ilogb