名稱空間
變體
操作

remquo, remquof, remquol

來自 cppreference.com
< c‎ | 數值‎ | 數學
 
 
 
常用數學函式
函式
基本操作
remquo
(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)
浮點數操作
(C99)(C99)
(C99)(C23)
(C99)
窄化操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子與量子指數
十進位制重新編碼函式
總序和載荷函式
分類
(C99)
(C99)
(C99)
(C23)
誤差函式和伽馬函式
(C99)
(C99)
(C99)
(C99)
型別
宏常量
特殊浮點值
(C99)(C23)
引數和返回值
錯誤處理
快速操作指示符
 
定義於標頭檔案 <math.h>
float       remquof( float x, float y, int *quo );
(1) (C99 起)
double      remquo( double x, double y, int *quo );
(2) (C99 起)
long double remquol( long double x, long double y, int *quo );
(3) (C99 起)
定義於標頭檔案 <tgmath.h>
#define remquo( x, y, quo )
(4) (C99 起)
1-3) 計算除法運算 x/y 的浮點餘數,與 remainder() 函式相同。此外,x/y 的符號和至少最後三位將儲存在 quo 中,足以確定結果在一個週期內的象限。
4) 泛型宏:如果任何非指標引數的型別為 long double,則呼叫 remquol。否則,如果任何非指標引數具有整數型別或型別為 double,則呼叫 remquo。否則,呼叫 remquof

目錄

[編輯] 引數

x, y - 浮點值
quo - 指向一個整數值,用於儲存 x/y 的符號和一些位

[編輯] 返回值

如果成功,返回除法 x/y 的浮點餘數,其定義與 remainder 相同,並在 *quo 中儲存 x/y 的符號和至少三位最低有效位(形式上,儲存一個值,其符號是 x/y 的符號,其幅值與 x/y 的整數商的幅值模 2n
同餘,其中 n 是一個實現定義的整數,大於或等於 3)。

如果 y 為零,則儲存在 *quo 中的值是未指定的。

如果發生域錯誤,則返回實現定義的值 (支援 NaN 時返回 NaN)。

如果由於下溢發生範圍錯誤,並且支援非正規數,則返回正確結果。

如果 y 為零,但未發生域錯誤,則返回零。

[編輯] 錯誤處理

錯誤按 math_errhandling 中指定的方式報告。

如果 y 為零,則可能發生域錯誤。

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

  • 當前的舍入模式無效。
  • FE_INEXACT 從不引發
  • 如果 x 是 ±∞ 且 y 不是 NaN,則返回 NaN 並引發 FE_INVALID
  • 如果 y 是 ±0 且 x 不是 NaN,則返回 NaN 並引發 FE_INVALID
  • 如果 xy 是 NaN,則返回 NaN

[編輯] 注意

POSIX 要求如果 x 是無窮大或 y 為零,則會發生域錯誤。

此函式在實現週期函式時很有用,其中週期可以精確表示為浮點值:當計算非常大的 xsin(πx) 時,直接呼叫 sin 可能會導致很大誤差,但如果首先使用 remquo 對函式引數進行約化,則商的低階位可用於確定結果在週期內的符號和象限,而餘數可用於高精度計算值。

在某些平臺上,此操作由硬體支援(例如,在 Intel CPU 上,FPREM1 在商中保留精確的 3 位精度)。

[編輯] 示例

#include <fenv.h>
#include <math.h>
#include <stdio.h>
 
#ifndef __GNUC__
#pragma STDC FENV_ACCESS ON
#endif
 
double cos_pi_x_naive(double x)
{
    const double pi = acos(-1);
    return cos(pi * x);
}
 
// the period is 2, values are (0;0.5) positive, (0.5;1.5) negative, (1.5,2) positive
double cos_pi_x_smart(double x)
{
    const double pi = acos(-1);
    int extremum;
    double rem = remquo(x, 1, &extremum);
    extremum = (unsigned)extremum % 2; // keep 1 bit to determine nearest extremum
    return extremum ? -cos(pi * rem) : cos(pi * rem);
}
 
int main(void)
{
    printf("cos(pi * 0.25) = %f\n", cos_pi_x_naive(0.25));
    printf("cos(pi * 1.25) = %f\n", cos_pi_x_naive(1.25));
    printf("cos(pi * 1000000000000.25) = %f\n", cos_pi_x_naive(1000000000000.25));
    printf("cos(pi * 1000000000001.25) = %f\n", cos_pi_x_naive(1000000000001.25));
    printf("cos(pi * 1000000000000.25) = %f\n", cos_pi_x_smart(1000000000000.25));
    printf("cos(pi * 1000000000001.25) = %f\n", cos_pi_x_smart(1000000000001.25));
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    int quo;
    printf("remquo(+Inf, 1) = %.1f\n", remquo(INFINITY, 1, &quo));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID raised");
}

可能的輸出

cos(pi * 0.25) = 0.707107
cos(pi * 1.25) = -0.707107
cos(pi * 1000000000000.25) = 0.707123
cos(pi * 1000000000001.25) = -0.707117
cos(pi * 1000000000000.25) = 0.707107
cos(pi * 1000000000001.25) = -0.707107 
remquo(+Inf, 1) = -nan
    FE_INVALID raised

[編輯] 參考文獻

  • C23 標準 (ISO/IEC 9899:2024)
  • 7.12.10.3 remquo 函式 (p: TBD)
  • 7.25 型別通用數學 <tgmath.h> (p: TBD)
  • F.10.7.3 remquo 函式 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • 7.12.10.3 remquo 函式 (p: 186)
  • 7.25 型別通用數學 <tgmath.h> (p: 272-273)
  • F.10.7.3 remquo 函式 (p: 385)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.12.10.3 remquo 函式 (p: 255)
  • 7.25 型別通用數學 <tgmath.h> (p: 373-375)
  • F.10.7.3 remquo 函式 (p: 529)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.12.10.3 remquo 函式 (p: 236)
  • 7.22 型別通用數學 <tgmath.h> (p: 335-337)
  • F.9.7.3 remquo 函式 (p: 465)

[編輯] 另請參閱

計算整數除法的商和餘數
(函式) [編輯]
(C99)(C99)
計算浮點除法運算的餘數
(函式) [編輯]
計算浮點除法運算的帶符號餘數
(函式) [編輯]
C++ 文件 關於 remquo