std::remquo
性病:维持原状
Defined in header | | |
---|---|---|
float remquo( float x, float y, int* quo | (1) | (since C++11) |
double remquo( double x, double y, int* quo | (2) | (since C++11) |
long double remquo( long double x, long double y, int* quo | (3) | (since C++11) |
Promoted remquo( Arithmetic1 x, Arithmetic2 y, int* quo | (4) | (since C++11) |
1-3%29计算除法操作的浮点余数。x/y
就像std::remainder()
功能是这样的。另外,标志和至少最后的三位x/y
将存储在quo
,足以在一段时间内确定结果的重要性。
的所有参数组合的一组重载或函数模板算术类型不包括在1-3的范围内。如果任何非指针参数积分型,它被铸造成double
如果任何其他非指针参数是long double
,则返回类型为long double
,否则就是double
...
参数
x, y | - | floating point values |
---|---|---|
quo | - | pointer to an integer value to store the sign and some bits of x/y |
返回值
如果成功,则返回除法的浮点余数。x/y
中定义的std::remainder
,和商店,在*quo
的标志和至少三个最不重要的部分x/y
%28形式上,存储其符号为x/y
其幅度为同余模2n。
的积分商数的大小x/y
,其中n是一个实现定义的整数,大于或等于3%29。
如果y
中存储的值为零。*quo
没有具体说明。
如果发生域错误,则返回支持%29的实现定义值%28 NaN。
如果由于下流而发生范围错误,则如果支持异常,则返回正确的结果。
如果y
为零,但域错误不发生,则返回零。
错误处理
错误按数学[医]错误处理...
域错误可能发生在y
是零。
如果实现支持ieee浮点算法%28IEC 60559%29,
- 电流舍入方式没有效果。
FE_INEXACT
永远不会被提起
- 如果
x
是±∞和y
不是南,南回来了FE_INVALID
提出来
- 如果
y
是±0和x
不是南,南回来了FE_INVALID
提出来
- 如果
x
或y
是南,南回来了
注记
POSIX要求,则域错误将发生在以下情况下:x
是无限的或y
是零。
此函数在实现周期函数时非常有用,周期完全可以表示为浮点值:当计算一个非常大的值时,当计算sin%28πx
%29时。x
,呼叫std::sin
直接导致较大的错误,但是如果函数参数首先被还原为std::remquo
商的低阶位可用于在周期内确定结果的符号和符号,而剩余的位可用于高精度地计算值。
在某些平台上,硬件%28支持此操作,例如在Intel CPU上,FPREM1
当完成%29时,在商中留下精确的3位精度。
例
二次
#include <iostream>
#include <cmath>
#include <cfenv>
#pragma STDC FENV_ACCESS ON
const double pi = std::acos(-1
double cos_pi_x_naive(double x) { return std::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)
{
int quadrant;
double rem = std::remquo(x, 1, &quadrant
quadrant = (unsigned)quadrant % 2; // The period is 2.
switch(quadrant) {
case 0: return std::cos(pi * rem
case 1: return -std::cos(pi * rem
};
}
int main()
{
std::cout << "cos(pi * 0.25) = " << cos_pi_x_naive(0.25) << '\n'
<< "cos(pi * 1.25) = " << cos_pi_x_naive(1.25) << '\n'
<< "cos(pi * 2.25) = " << cos_pi_x_naive(2.25) << '\n'
<< "cos(pi * 0.25) = " << cos_pi_x_smart(0.25) << '\n'
<< "cos(pi * 1.25) = " << cos_pi_x_smart(1.25) << '\n'
<< "cos(pi * 2.25) = " << cos_pi_x_smart(2.25) << '\n'
<< "cos(pi * 1000000000000.25) = "
<< cos_pi_x_naive(1000000000000.25) << '\n'
<< "cos(pi * 1000000000001.25) = "
<< cos_pi_x_naive(1000000000001.25) << '\n'
<< "cos(pi * 1000000000000.25) = "
<< cos_pi_x_smart(1000000000000.25) << '\n'
<< "cos(pi * 1000000000001.25) = "
<< cos_pi_x_smart(1000000000001.25) << '\n';
// error handling
std::feclearexcept(FE_ALL_EXCEPT
int quo;
std::cout << "remquo(+Inf, 1) = " << std::remquo(INFINITY, 1, &quo) << '\n';
if(fetestexcept(FE_INVALID)) std::cout << " FE_INVALID raised\n";
}
二次
可能的产出:
二次
cos(pi * 0.25) = 0.707107
cos(pi * 1.25) = -0.707107
cos(pi * 2.25) = 0.707107
cos(pi * 0.25) = 0.707107
cos(pi * 1.25) = -0.707107
cos(pi * 2.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
二次
另见
div(int)ldivlldiv (C++11) | computes quotient and remainder of integer division (function) |
---|---|
fmod | remainder of the floating point division operation (function) |
remainder (C++11) | signed remainder of the division operation (function) |
C.维持原状的文件
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。