?
This document uses PHP Chinese website manual Release
在頭文件<math.h>中定義 | ||
---|---|---|
float remquof( float x, float y, int *quo ); | (1) | (since C99) |
double remquo( double x, double y, int *quo ); | (2) | (since C99) |
long double remquol( long double x, long double y, int *quo ); | (3) | (since C99) |
Defined in header <tgmath.h> | ||
#define remquo( x, y, quo ) | (4) | (since C99) |
1-3)x/y
根據(jù)remainder()
函數(shù)計算除法運(yùn)算的浮點(diǎn)余數(shù)。此外,符號和至少三個最后的比特x/y
將被存儲在其中quo
,足以確定一段時間內(nèi)結(jié)果的八分之一。
4)類型 - 通用宏:如果任何非指針參數(shù)具有類型long double
,remquol
則被調(diào)用。否則,如果任何非指針參數(shù)具有整數(shù)類型或具有類型double
,remquo
則被調(diào)用。否則,remquof
被調(diào)用。
x,y | - | 浮點(diǎn)值 |
---|---|---|
quo | - | 指向一個整數(shù)值的指針來存儲符號和x / y的一些位 |
如果成功,則返回除法的浮點(diǎn)余x/y
中定義remainder
,并存儲,在*quo
,符號和至少三個的至少顯著位x/y
(正式地說,存儲其符號是符號的值x/y
,其大小是全等模2n
與x/y
其中n是大于或等于3的實(shí)現(xiàn)定義的整數(shù)的整數(shù)商數(shù)的大小)。
如果y
為零,則存儲的值*quo
未指定。
如果發(fā)生域錯誤,則返回實(shí)現(xiàn)定義的值(NaN,如果支持)。
如果由于下溢而發(fā)生范圍錯誤,如果支持子正常則返回正確的結(jié)果。
如果y
為零,但域錯誤不會發(fā)生,則返回零。
按照math_errhandling中的指定報告錯誤。
如果y
為零,則可能會出現(xiàn)域錯誤。
如果實(shí)現(xiàn)支持IEEE浮點(diǎn)運(yùn)算(IEC 60559),
當(dāng)前的舍入模式不起作用。
FE_INEXACT
從未被提出
如果x
是±∞并且y
不是NaN,則返回并FE_INVALID
提升NaN
如果y
是±0并且x
不是NaN,則返回并FE_INVALID
提升NaN
如果是x
或者y
是NaN,則返回NaN
如果x
是無限的或者y
是零,POSIX要求發(fā)生域錯誤。
這個函數(shù)在實(shí)現(xiàn)周期函數(shù)時非常有用,該周期函數(shù)的周期可以精確地表示為一個浮點(diǎn)值:當(dāng)計算一個非常大的sin(πx)時x
,sin
直接調(diào)用可能會導(dǎo)致大的錯誤,但是如果函數(shù)參數(shù)首先被減少remquo
,可以使用商的低位比特來確定該周期內(nèi)結(jié)果的符號和八分之一,而余數(shù)可以用于以高精度計算該值。
在某些平臺上,該操作由硬件支持(例如,在Intel CPU上,FPREM1
精確度僅為3位)。
#include <stdio.h>#include <math.h>#include <fenv.h> #pragma STDC FENV_ACCESS ON double cos_pi_x_naive(double x){ 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) positivedouble cos_pi_x_smart(double x){ int quadrant; double rem = remquo(x, 1, &quadrant); quadrant = (unsigned)quadrant % 4; // keep 2 bits to determine quadrant double pi = acos(-1); switch(quadrant) { case 0: return cos(pi * rem); case 1: return -cos(pi * rem); case 2: return -cos(pi * rem); case 3: return 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.707107cos(pi * 1.25) = -0.707107cos(pi * 1000000000000.25) = 0.707123cos(pi * 1000000000001.25) = -0.707117cos(pi * 1000000000000.25) = 0.707107cos(pi * 1000000000001.25) = -0.707107 remquo(+Inf, 1) = -nan FE_INVALID raised
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
7.12.10.3遙控功能(p:255)
7.25類型通用數(shù)學(xué)<tgmath.h>(p:373-375)
F.10.7.3遙控功能(p:529)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
7.12.10.3遙控功能(p:236)
7.22類型通用數(shù)學(xué)<tgmath.h>(p:335-337)
F.9.7.3遙控功能(p:465)