【发布时间】:2014-10-02 00:41:19
【问题描述】:
C#,VS 2010
我需要确定一个浮点值是否为 NaN。
使用
测试 NaN 的浮点数float.IsNaN(aFloatNumber)
由于堆栈溢出而崩溃。
也是这样
aFloatNumber.CompareTo(float.NaN).
以下内容不会崩溃,但它没有用,因为它无论如何都会返回 NaN:
aFloatNumber - float.NaN
搜索“堆栈溢出”会返回有关此网站的结果,而不是有关实际堆栈溢出的结果,因此我找不到相关答案。
为什么我的应用程序在测试 NaN 时会发生堆栈溢出?
编辑:调用堆栈:
编辑:这显然是我的代码中的内容:此声明:
bool aaa = float.IsNaN(float.NaN);
- 在应用程序的构造函数中工作正常,就在 InitializeComponent() 之后;
- 在自定义控件类的构造函数中工作正常,就在 InitializeComponent() 之后;
- 但在自定义控件类内的事件处理程序中崩溃。
所以,这就是我正在做的:
- 抽象自定义控件:公共抽象部分类 ConfigNumberBaseBox : TextBox
- 有一个验证事件处理程序 ValidateTextBoxEntry
- ValidateTextBoxEntry 在 ConfigNumberBaseBox 类中定义
- 从 ConfigNumberBaseBox 继承的自定义控件:公共部分类 ConfigTemperBox:ConfigNumberBaseBox
- 运行应用程序
- 当我完成对 ConfigTemperBox 控件的编辑后,将调用 ValidateTextBoxEntry
- ValidateTextBoxEntry 运行良好,直到遇到 float.IsNaN
- 堆栈溢出
编辑:
Debug.WriteLine() 显示代码只执行一次:没有递归。
编辑:
这行得通:
float fff = 0F;
int iii = fff.CompareTo(float.PositiveInfinity);
这会崩溃:
float fff = 0F;
int iii = fff.CompareTo(float.NaN);
【问题讨论】:
-
我不相信这是比较,它必须是您代码中的其他内容。当你得到 stackoverflow 时,调用堆栈是什么?
-
IsNaN定义为return (*(int*)(&f) & 0x7FFFFFFF) > 0x7F800000;。这本身不能进行堆栈溢出。你的代码有问题。 -
创建一个显示此行为的最小示例。
-
这可能是调试器在不相关的行上向您显示异常,如果您有递归,请查看其他地方
-
ValidateTextBoxEntry可能被递归调用(当然是无意的 :),在其中创建一个Debug.WriteLine()并观察应用程序的输出
标签: c# stack-overflow nan