【发布时间】:2019-09-27 22:44:24
【问题描述】:
问题
我想查看执行浮点除法并在除以零时返回Infinity 的代码。我在哪里可以找到它?
代码示例
想知道这一点的动机来自 .NET 文档中的这段代码。我本来希望得到DivideByZeroException,但我得到了Infinity。
using System;
public class Example
{
public static void Main()
{
int number1 = 3000;
int number2 = 0;
Console.WriteLine((double)number1 / number2);
}
}
// The example displays the following output:
// Infinity
文档
我找到了说明浮点除以零不会引发异常的文档,这很好:
将浮点值除以零不会引发异常;它 导致正无穷大、负无穷大或不是数字 (NaN),根据 IEEE 754 算术规则。因为 以下示例使用浮点除法而不是整数 除法,该操作不会抛出 DivideByZeroException 例外。
.NET Framework 中的代码
在 Visual Studio 中,我将鼠标悬停在“/”除号上,Resharper 显示
double double.operator /(double left, double right)
现在,我想看看它的实现,看看Infinity 是如何返回的。但我找不到。
我在这里检查过
但看不到除法运算符。
然后上面的链接带我到这里
但也没有关于实现细节。
我也看过这里
但只能看到注释掉的代码
/// Double IArithmetic<Double>.Divide(Double divisor, out bool overflowed) {
/// Double s = m_value / divisor;
/// overflowed = IsInfinity(s) || IsNaN(s);
/// return s;
/// }
在corefx 的Double 实现中也没有任何内容:
我会期待这样的东西(伪代码):
public static double operator /(double left, double right)
{
if (right == 0)
{
return double.Infinity;
}
else
{
...
}
}
【问题讨论】:
-
您实际上不需要查看源代码,ECMA 规范应该可以。查看 14.7.2 除法运算符.....有一张表格告诉你它是如何实现的
-
实现在. FPU,不是一行代码。无论哪种情况,它都是场外资源,因此离题。
-
这是你的来源 fdivp felixcloutier.com/x86/fdiv:fdivp:fidiv
-
@user207421:与异地资源相关的 Stack Overflow 关闭的原因是请求对异地资源提出建议,因为它们会吸引意见。它不适用于关于资源存在的查询,这些资源是否适用于某个请求是事实而非意见。
标签: c# floating-point divide-by-zero