如果我们将float和double类型设置为NaN,则它们不等于包括它们在内的任何东西.int
会发生这样的事吗?
我想用 gfortran 编译一个程序并-O3 -ffast-math启用它,因为它可以提供很好的性能提升。我很困惑,gfortranisnan()捕获了一些 NaN,但不是全部。看完之后
检查 C++ 中的 double(或 float)是否为 NaN
如何制作可移植的 isnan/isinf 函数
负 NaN 不是 NaN?
我的印象是,即使启用了快速数学,人们也可以通过位调整来检查 C 中的 NaN。然而,这让我感到困惑,因为快速数学
可能会导致依赖于数学函数的 IEEE 或 ISO 规则/规范的精确实现的程序输出不正确。
根据 gcc 4.7.2 的手册页。那么,如果数字没有按照 IEEE 标准表示,您如何知道要检查哪一位呢?如果您知道它,您将如何在 Fortran 95/03/08 中实现它?
不要费心发布(x \= x)依赖于 IEEE 规则的类似解决方案。他们给出的结果与 相同isnan()。我也知道-ffpe-trap=invalid,zero,overflow,但不想停止该程序。如果有帮助的话,我的操作系统是 64 位 LinuxMint 14。如果 Fortran 中不可能,防水的 C 解决方案也很好。
我们有用C ++编写的数字代码。很少但在某些特定输入下,某些计算会得出“ nan”值。
是否存在一种标准或推荐的方法,当某些数值计算导致生成“ nan”时,我们可以通过该方法停止并提醒用户?(在调试模式下)鉴于矩阵和向量的尺寸很大,检查每个结果是否等于'nan'似乎不切实际。
标准数值库如何处理这种情况?你能对此有所启发吗?
我-Ofast在我的程序中使用gcc选项导致延迟要求.我写了简单的测试程序:
#include <iostream>
#include <math.h>
static double quiet_NaN = std::numeric_limits<double>::quiet_NaN();
int main()
{
double newValue = 130000;
double curValue = quiet_NaN;
printf("newValue = %f\n", newValue);
printf("curValue = %f\n", curValue);
printf("isnan(newValue) = %d\n", isnan(newValue));
printf("isnan(curValue) = %d\n", isnan(curValue));
printf("newValue == curValue %d\n", (newValue == curValue));
printf("newValue != curValue %d\n", (newValue != curValue));
}
Run Code Online (Sandbox Code Playgroud)
我试图用默认标志和-Ofast运行它:
$ g++ TestPointer.cpp
$./a.out
newValue = 130000.000000
curValue = nan
isnan(newValue) = 0
isnan(curValue) = 1
newValue == curValue 0
newValue != curValue 1
$ …Run Code Online (Sandbox Code Playgroud) 在编程测试中我被问到这个questino.问题是,我作为参数在float中传递,并询问以下代码何时为false.
bool result = (floatValue == floatValue);
Run Code Online (Sandbox Code Playgroud)
我想不出一个有效的理由或何时会出现这种情况,但仍然不能.最后,我回答说永远不会出现这种情况.想知道是否有人可以给我一些关于什么时候这是假的例子
需要在matlab和一些DLL函数之间来回传递一些数据,有一点可以看出我们在matlab中不知道NaN的精确数值,因此会有一些不必要的数据处理来考虑这些值.
有人知道matlab中NaN的确切值或至少值的范围吗?
我最感兴趣的是了解以下两种主要类型:
(1)浮法NaN(32);
(2)NaN为双(64).
在某些情况下,使用 GCC + 编译时,将正常的浮点数与std::numeric_limits<float>::quiet_NaN()总是产生比较(在 Linux 和 MinGW 上测试)。在其他情况下,它总是会产生(这将是符合 IEEE 的行为)。"true""-ffast-math""false"
如果quiet_NaN在编译时已知其中一个值是 a ,则该行为符合 IEEE 标准,并且分支会被优化掉。
我知道这"-ffast-math"允许违反 IEEE 规则,并且它意味着"-ffinite-math-only"假设没有 NaN。但即使"-ffast-math"结果quiet_NaN()具有特定的位模式(例如 7FF80000),那么与普通浮点数的比较如何0.5f可能产生真值?
这是显示不同情况的代码示例。请用"g++ -O3 -ffast-math".
#include <iostream>
#include <limits>
int main() {
#if 1
// make sure that the value of 'x' is not known at compile time
bool isnan;
std::cout << "use nan (0|1): ";
std::cin >> isnan;
#else
// otherwise GCC …Run Code Online (Sandbox Code Playgroud) 有没有直接的方法来创建一个掩码,其中a中的值cv::Mat_<double>与NAN进行比较?
cv::Mat_<real> mat = ...
cv::Mat_<uchar> mask = (mat == NAN);
Run Code Online (Sandbox Code Playgroud)
不起作用因为f == NAN总是假的,即使f被分配了NAN.isnan()矩阵似乎没有过载.
当然我知道我应该编写更好的代码,而不是创建NaN值.但有没有随意的方法来避免它.我的意思是:
if (!(floatNumber == NaN))
// do some stupid function
else
return;
Run Code Online (Sandbox Code Playgroud)
但它对我不起作用.我也尝试过floatNumber==null,但也没有结果.请你帮助我好吗?
我有
std::vector<double>x={1,2,NAN,3, NAN, 4}
Run Code Online (Sandbox Code Playgroud)
当我尝试x.erase(remove(x.begin(), x.end(), NAN), x.end(),我仍然看到NAN作为
for (auto i:x)
std::cout<<i<<" ";
Run Code Online (Sandbox Code Playgroud)
给
1 2 -nan(ind) 3 -nan(ind) 4
Run Code Online (Sandbox Code Playgroud)
如何删除NAN,所以输出如下?
1 2 3 4
Run Code Online (Sandbox Code Playgroud)
编辑:x是双精度的向量,而不是整数