名稱空間
變體
操作

frexp, frexpf, frexpl

來自 cppreference.com
< c‎ | 數值‎ | 數學
 
 
 
常用數學函式
函式
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大值/最小值操作
(C99)
(C99)
指數函式
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
冪函式
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角函式和雙曲函式
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最近整數浮點數
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮點數操作
frexp
(C99)(C99)
(C99)(C23)
(C99)
窄化操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子與量子指數
十進位制重新編碼函式
總序和載荷函式
分類
(C99)
(C99)
(C99)
(C23)
誤差函式和伽馬函式
(C99)
(C99)
(C99)
(C99)
型別
宏常量
特殊浮點值
(C99)(C23)
引數和返回值
錯誤處理
快速操作指示符
 
定義於標頭檔案 <math.h>
float       frexpf( float arg, int* exp );
(1) (C99 起)
double      frexp( double arg, int* exp );
(2)
long double frexpl( long double arg, int* exp );
(3) (C99 起)
定義於標頭檔案 <tgmath.h>
#define frexp( arg, exp )
(4) (C99 起)
1-3) 將給定浮點值 x 分解為歸一化小數和二的整數次冪。
4) 型別泛型宏:若 arg 的型別為 long double,則呼叫 frexpl。否則,若 arg 的型別為整數型別或 double,則呼叫 frexp。否則,呼叫 frexpf

目錄

[編輯] 引數

arg - 浮點值
exp - 指向儲存指數的整數值的指標

[編輯] 返回值

arg 為零,則返回零並將零儲存到 *exp 中。

否則(若 arg 非零),若無錯誤發生,則返回範圍 (-1;-0.5], [0.5; 1) 內的值 x,並將整數值儲存到 *exp 中,使得 x×2(*exp)
=arg

若要儲存到 *exp 中的值超出 int 的範圍,則行為未指定。

arg 不是浮點數,則行為未指定。

[編輯] 錯誤處理

此函式不受 math_errhandling 中指定的任何錯誤的影響。

如果實現支援 IEEE 浮點運算 (IEC 60559),

  • arg 為 ±0,則返回 ±0,且 0 儲存到 *exp 中。
  • arg 為 ±∞,則返回 ±∞,且未指定的值儲存到 *exp 中。
  • arg 為 NaN,則返回 NaN,且未指定的值儲存到 *exp 中。
  • 不引發任何浮點異常。
  • FLT_RADIX2(或 2 的冪),則返回值為精確值,當前舍入模式被忽略。

[編輯] 注意

在二進位制系統上(其中 FLT_RADIX2),frexp 可以實現為

{
    *exp = (value == 0) ? 0 : (int)(1 + logb(value));
    return scalbn(value, -(*exp));
}

函式 frexp,與其對偶函式 ldexp 一起,可用於在不直接進行位操作的情況下,操作浮點數的表示。

[編輯] 示例

#include <float.h>
#include <math.h>
#include <stdio.h>
 
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);
}

可能的輸出

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

[編輯] 參考

  • C23 標準 (ISO/IEC 9899:2024)
  • 7.12.6.4 frexp 函式 (p: TBD)
  • 7.25 型別通用數學 <tgmath.h> (p: TBD)
  • F.10.3.4 frexp 函式 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • 7.12.6.4 frexp 函式 (p: TBD)
  • 7.25 型別通用數學 <tgmath.h> (p: TBD)
  • F.10.3.4 frexp 函式 (p: TBD)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.12.6.4 frexp 函式 (p: 243)
  • 7.25 型別通用數學 <tgmath.h> (p: 373-375)
  • F.10.3.4 frexp 函式 (p: 521)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.12.6.4 frexp 函式 (p: 224)
  • 7.22 型別通用數學 <tgmath.h> (p: 335-337)
  • F.9.3.4 frexp 函式 (p: 458)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.5.4.2 frexp 函式

[編輯] 參閱

將一個數字乘以2的冪
(函式) [編輯]
(C99)(C99)(C99)
提取給定數字的指數
(函式) [編輯]
(C99)(C99)(C99)
提取給定數字的指數
(函式) [編輯]
(C99)(C99)
將一個數字分解為整數部分和小數部分
(函式) [編輯]
C++ 文件frexp