相关疑难解决方法(0)

int a; ...; (a == a)失败了吗?

如果我们将floatdouble类型设置为NaN,则它们不等于包括它们在内的任何东西.int
会发生这样的事吗?

c++

7
推荐指数
2
解决办法
761
查看次数

是否可以使 isnan() 在 gfortran -O3 -ffast-math 中工作?

我想用 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 解决方案也很好。

optimization fortran nan gfortran ieee-754

5
推荐指数
1
解决办法
1852
查看次数

在C ++中以数字代码为基础的计算中发信号或捕获'nan'

我们有用C ++编写的数字代码。很少但在某些特定输入下,某些计算会得出“ nan”值。

是否存在一种标准或推荐的方法,当某些数值计算导致生成“ nan”时,我们可以通过该方法停止并提醒用户?(在调试模式下)鉴于矩阵和向量的尺寸很大,检查每个结果是否等于'nan'似乎不切实际。

标准数值库如何处理这种情况?你能对此有所启发吗?

c++ debugging exception-handling nan numerical-methods

5
推荐指数
1
解决办法
570
查看次数

gcc -Ofast - 完整的限制列表

-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)

c++ gcc fast-math

5
推荐指数
1
解决办法
7420
查看次数

何时浮点变量不等于自身

在编程测试中我被问到这个questino.问题是,我作为参数在float中传递,并询问以下代码何时为false.

bool result  = (floatValue == floatValue);
Run Code Online (Sandbox Code Playgroud)

我想不出一个有效的理由或何时会出现这种情况,但仍然不能.最后,我回答说永远不会出现这种情况.想知道是否有人可以给我一些关于什么时候这是假的例子

c++ floating-point

5
推荐指数
1
解决办法
1485
查看次数

在matlab中NaN的确切值是多少?

需要在matlab和一些DLL函数之间来回传递一些数据,有一点可以看出我们在matlab中不知道NaN的精确数值,因此会有一些不必要的数据处理来考虑这些值.

有人知道matlab中NaN的确切值或至少值的范围吗?

我最感兴趣的是了解以下两种主要类型:

(1)浮法NaN(32);

(2)NaN为双(64).

double matlab nan

4
推荐指数
2
解决办法
1887
查看次数

使用“-ffast-math”在 GCC 上与 quiet_NaN 进行浮点比较总是产生真(!)

在某些情况下,使用 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)

c++ c++11

4
推荐指数
1
解决办法
282
查看次数

过滤OpenCV Mat以获取NAN值

有没有直接的方法来创建一个掩码,其中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()矩阵似乎没有过载.

c++ opencv nan mat

3
推荐指数
1
解决办法
4820
查看次数

如何避免C++中的NaN

当然我知道我应该编写更好的代码,而不是创建NaN值.但有没有随意的方法来避免它.我的意思是:

if (!(floatNumber == NaN))
   // do some stupid function
else
return;
Run Code Online (Sandbox Code Playgroud)

但它对我不起作用.我也尝试过floatNumber==null,但也没有结果.请你帮助我好吗?

c++ floating-point nan

3
推荐指数
1
解决办法
1550
查看次数

如何从C ++向量中删除NAN?

我有

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是双精度的向量,而不是整数

c++ nan

3
推荐指数
1
解决办法
322
查看次数