2011-03-22 66 views
1

我有两个控制台应用程序(msvc 2008)。当它们被零除时, 它们的行为不同。我的问题如下。msvc除以零

a)在一个应用中,除零的结果显示为1.#INF000000000000作为调试器。
Printf“%4.1f”将其打印为“1. $”。

b)在另一个应用程序中,在调试器中除以零9.2559631349317831e + 061的结果。
Printf“%4.1f”将其打印为“-1。$”。

  1. Why既不应用具有零对DIV异常或信号?
    是不是例外/信号默认dehavour?

  2. 什么是define以上两个常量的名字?

  3. 一般情况下,如果我在div之前检查分母== 0,那么我应该使用哪个define值作为虚拟结果? DBL_MIN好吗?我发现NaN值不是。

  4. 我可以告诉stdio如何将一个特定的double值格式化为char字符串我告诉它吗?我意识到这是太多要问。但是,以我的应用程序中的viro DBL_MIN为例,说告诉stdio打印,比如“n/a”会很好。

  5. 我应该如何处理,以实现最佳的可移植性,零除以及打印结果?通过打印,我的意思是“打印数字为'不适用',如果它是由零除的结果”。
    在这里我不清楚,我怎样才能以便携的方式在一个双倍的情况下代表零的结果。

  6. 为什么两个不同的结果?它是编译器选项?

编译器是C++,但使用非常像C.感谢。

+1

因为除零不是一个指定的标准异常。看到这篇文章http://stackoverflow.com/questions/4747934/c-catch-a-divide-by-zero-error获取更多信息。 – Mahesh 2011-03-22 23:01:22

+0

@Mahesh:这个问题处理*整数*除零。这个问题是关于浮点运算,它们的处理方式大不相同。 – Lindydancer 2011-04-09 10:35:19

回答

1

当用零进行浮点除法时,结果应该是无穷大(用特殊位模式表示)。

我的猜测是第二个应用程序实际上并不是按零执行除法,而是一个非常小的除法。您可以通过在调试器或跟踪输出中检查底层表示来检查此问题(您可以通过将它放在浮点类型和相同大小的整数中来访问它)。请注意,仅仅打印它可能不会揭示这一点,因为打印算法有时会将非常小的数字打印为零。