【发布时间】:2017-10-28 03:23:00
【问题描述】:
我目前正在处理 C++ 中的浮点值。 考虑以下 c++ sn-p:
#include <cmath>
#include <cstring>
#include <iostream>
int main() {
long double num;
// Set num to a large, valid, floating point value
memset(&num, 0xcc, sizeof(num));
std::cout << "num = " << num << std::endl;
std::cout << "isinf(num) = " << isinf(num) << std::endl;
std::cout << "std::isinf(num) = " << std::isinf(num) << std::endl;
return 0;
}
根据Wikipedia,这将创建一个 80 位 extended precision 浮点值,因为我在 x86 机器上使用 GCC。因此浮点值为0xcccc cccc cccc cccc cccc,应该是有效值。
有趣的是,输出如下:
num = -4.77987e+986
isinf(num) = 1
std::isinf(num) = 0
这让我想知道:
- 为什么
isinf和std::isinf的行为不同?哪一个值得信赖? -
Here 它说在 C99 中, isinf 是一个宏,而在 C++11 中,它变成了一个函数。但是,当我编译示例时,例如使用
-std=c++98,我仍然会得到相同的行为。std::isinf在那种情况下不应该被定义吗? - 一般来说,我如何知道我的编译器/架构使用哪种浮点格式?
【问题讨论】:
-
您使用的是什么编译器版本?我在使用 gcc 6.20 时遇到错误,并且 OS X 上的 clang 给出了
isinf(num) = 0。
标签: c++ c++11 floating-point ieee-754