我想知道是什么让c ++中的浮点数为nan。我使用的是大型数据集,很难追踪。我想知道将浮点数改为nan的方法,以减少bug的可能性。
我找到了导致nan问题的代码。我发现在某些情况下s / m是nan。但我不知道如何解决它。
float gp(float x){
float e = 2.71828183;
x *= -1;
float s = pow(e,x);
float m = (1 + pow(e,x)) * (1 + pow(e,x));
return s / m;}
答案 0 :(得分:5)
取自wikipedia - >特殊值 - >南
看着你的代码:无限时间0是可能的,是吗?
0< = s< = + inf
1< = m< = + inf
s / m:
我认为这是制造NaN的唯一因素。
答案 1 :(得分:5)
如果你可以将x
保持在0和FLT_MAX
之间(在我的情况下为3.40E + 38),你的gp函数将不会返回NaN。
答案 2 :(得分:3)
您在评论中说,您只使用*
,+
,-
。
[编辑:你已经说过你也使用了pow
和除法,它引入了一些获得NaN的额外方法。例如,如果参数x
是一个较大的负值,则pow(e,-x)
是无穷大,因此您可以轻松地最终计算无穷大/无穷大,这是另一个NaN]
因此,如果你有IEEE浮点,那么假设这个summary是正确的,你可以生成NaN的唯一方法是:
或:
因此,如果您检查并捕获无穷大,您也不必担心NaN。也就是说,通常的方法是让这些值像安静的NaN一样传播,并在最后检查。
对于使用非IEEE算法的C ++实现,我不确定允许NaN时的规则是什么。我可以在标准中查找它们,但是那样你也可以; - )
答案 3 :(得分:1)
sqrt(-1)
例如,给你NaN。
http://www.gnu.org/s/libc/manual/html_node/Infinity-and-NaN.html
答案 4 :(得分:0)
编辑尝试使用double
代替float
。
可能它取决于您使用的编译器,但一般选项是:
答案 5 :(得分:0)
这正是enabling and trapping floating-point exceptions的用例。这样,您就可以准确地检测NaN(或其他异常值)首次出现的位置。
但是,这是一个依赖于平台的功能,因此您可能需要查看编译器和/或硬件的文档。