我希望了解C++的数值特性,因此对下溢现象很感兴趣。有谁能给我举个下溢的例子并说明如何处理它?
浮点数下溢的一个例子是:
double d = DBL_MIN / 3.0;
d
设置为“次规范数(subnormal)”,即接近零且精度降低的数字。您可以在维基百科上找到大量信息。d
设置为零。x
使得sin(x)
或cos(x)
是一个次正规数,但这是基于合理的实现假设的。 - Pascal CuoqDBL_MIN/2
下溢,但如果启用了默认的下溢处理方式,则此下溢将被忽略(不会被标记并且实际上从未存在),因为结果是精确的。在默认模式下,精确结果永远不会下溢。相比之下,DBL_MIN/3
或DBL_MIN/(2./3)
总是会引发下溢标志。 - Eric Postpischilint main()
{
short int x ;
for(x=0;;x++)
{
printf("%d \n",x);
if(x < 0)
break;
}
}
输出
---
---
--
32761
32762
32763
32764
32765
32766
32767
-32768
假设您正在询问有符号数中的下溢概念。在这里,概念是有符号数就像一个圆圈一样工作,一旦到达圆圈的一半,它将进入该圆圈的负半部分,并且它将继续并永远不会结束。它从0-32767(+ve)-32768至-1(-ve)的一半开始。
这是程序员处理此情况的责任。如果您发生下溢,编译器不会引发任何错误。
希望这可以帮助您。
x++
被评估为x = (short)((int)x + 1)
。 它只会在转换为short时调用实现定义的行为。请参见http://blog.frama-c.com/index.php?post/2013/07/11/Arithmetic-overflows-in-Fluorine的测验部分。 - Pascal Cuoqint
,因此这与本题无关。 - R. Martinho Fernandes
INT_MIN
。无论哪种方式,都可能比我必须标记的注释少。这有点令人沮丧。 - chris