C++ 为什么;是“U模”;双精度浮点数是否为false?
我编写了一些代码来检查类型是否具有模表示:C++ 为什么;是“U模”;双精度浮点数是否为false?,c++,C++,我编写了一些代码来检查类型是否具有模表示: #include <iostream> #include <limits> using namespace std; int main( ) { cout << "Whether float objects have a modulo representation: " << numeric_limits<float>::is_modulo << en
#include <iostream>
#include <limits>
using namespace std;
int main( )
{
cout << "Whether float objects have a modulo representation: "
<< numeric_limits<float>::is_modulo << endl;
cout << "Whether double objects have a modulo representation: "
<< numeric_limits<double>::is_modulo << endl;
}
但是我们可以使用fmod()
(来自
)来找到浮点数的模。那么,如果有可能找到浮点或双精度的模,为什么
是_modulofalse?如下所述:
std::numeric_limits::is_modulo
的值适用于所有
使用模运算处理溢出的算术类型T
是,如果加法、减法、乘法或
此类型的除法将超出范围[min(),max()]
,即
此操作返回的值与预期值的差异为
max()-min()+1的倍数
因此,它并没有说“寻找模”,而是说a+b
将如何运行。浮点算术不会像整数算术那样溢出。
对于使用模运算处理溢出的所有算术类型T,即,如果此类型的加法、减法、乘法或除法的结果超出范围[min()
,max()
],则std::numeric\u limits::is_modulo
的值为true
,此操作返回的值与预期值相差max()-min()+1的倍数
浮点数溢出,因此std::numeric_limits::is_modulo
表示float
和double
表示为false
这与fmod
无关。对浮点值的任意操作是无关的
一个人是否有“模表示”就像无符号int
s自动环绕一样
无论是float
s还是double
s都不会这样做,因此是模
是false
Whether float objects have a modulo representation: 0
Whether double objects have a modulo representation: 0