当前位置: 首页 > 知识库问答 >
问题:

为C#进行浮点除法的代码在哪里?

孙京
2023-03-14

我想看一段进行浮点除法的代码,当除法为零时返回无穷大。我在哪里可以找到它?

想要知道这一点的动机来自于来自的代码。NET文档。我本来希望得到一个DivideByZeroException,但我得到的是无穷大。

https://docs.microsoft.com/en-us/dotnet/api/system.dividebyzeroexception?view=netframework-4.8#remarks

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

我发现留档声明浮点除以零不会抛出异常,所以没关系:

https://docs.microsoft.com/en-us/dotnet/api/system.dividebyzeroexception?view=netframework-4.8#remarks

将浮点值除以零不会引发异常;根据IEEE 754算术规则,它会导致正无穷大、负无穷大或不是数字(NaN)。因为下面的示例使用浮点除法而不是整数除法,所以该操作不会引发DiVideByZeroException异常。

在Visual Studio中,我将鼠标悬停在“/”除法符号上,然后重新显示

double double.operator /(double left, double right)

现在,我想看看它的实现,看看如何返回无穷大。但我找不到它。

我在这里查过了

  • https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/

但看不到除法运算符。

上面的链接然后引导我到这里

  • https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/arithmetic-operators#division-operator-

但也没有关于实现细节的任何信息。

我也看了这里

  • https://referencesource.microsoft.com/#mscorlib/system/double.cs,428

但只能看到注释掉的代码

///        Double IArithmetic<Double>.Divide(Double divisor, out bool overflowed) {
///            Double s = m_value / divisor;
///            overflowed = IsInfinity(s) || IsNaN(s);
///            return s;
///        }

corefx的Double实现中也没有任何内容:

  • https://github.com/dotnet/corefx/blob/master/src/Common/src/CoreLib/System/Double.cs

我本以为会有这样的东西(伪代码):

public static double operator /(double left, double right)
{
   if (right == 0)
   {
      return double.Infinity;
   }
   else
   {
      ...
   }
}

共有1个答案

何长恨
2023-03-14

您的代码编译为以下CIL:

.method public hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       21 (0x15)
  .maxstack  2
  .locals init (int32 V_0,
           int32 V_1)
  IL_0000:  nop
  IL_0001:  ldc.i4     0xbb8
  IL_0006:  stloc.0
  IL_0007:  ldc.i4.0
  IL_0008:  stloc.1
  IL_0009:  ldloc.0
  IL_000a:  conv.r8
  IL_000b:  ldloc.1
  IL_000c:  conv.r8
  IL_000d:  div
  IL_000e:  call       void [mscorlib]System.Console::WriteLine(float64)
  IL_0013:  nop
  IL_0014:  ret
} // end of method Example::Main

该调用是正在进行的除法操作。这意味着CLR将执行该工作,因此您将找不到任何执行该工作的源代码。如果我们深入研究浮点值除法运算符的CLR源代码(这里显示的是coreclr):

TFp FpDiv(TFp dividend, TFp divisor)
{
#ifdef _TARGET_ARMARCH_
    // From the ECMA standard:
    //
    // If [dividend] is zero and [divisor] is zero
    //   the result is NaN.
    // If [dividend] is infinity and [divisor] is infinity
    //   the result is NaN.

    if (dividend == 0 && divisor == 0)
    {
        return TFpTraits::NaN();
    }
    else if (!_finite(dividend) && !_isnan(dividend) && !_finite(divisor) && !_isnan(divisor))
    {
        return TFpTraits::NaN();
    }
#endif // _TARGET_ARMARCH_

    return dividend / divisor;
}

您可以看到它正在处理一些先决条件,然后调用编译器的内部操作。在x86上,这将依次是一个FDIV调用,它被记录为发出一个除以零的标志,由于IEEE 754,C运行时将变成无穷大。这个无穷大可以将它的工作方式备份到您的C#应用程序的链中。

 类似资料:
  • 我正在尝试设置一个 nodemcu 模块来收集来自温度传感器的数据,并使用 mqtt pubsubclient 将其发送到我的 mqtt 代理,但这不是问题所在。 我正在尝试以只有一个小数的格式发送温度,此时我已经成功地将其向上或向下舍入,但格式不正确。截至目前,它将温度四舍五入为24.50,27.80,23.10等。我想删除尾随的zereos,所以它变成24.5,27.8,23.1等。 到目前为

  • 本文向大家介绍清除浮动的方法有哪些?相关面试题,主要包含被问及清除浮动的方法有哪些?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 方法一:使用带clear属性的空元素 在浮动元素后使用一个空元素如 ,并在CSS中赋予.clear{clear:both;}属性即可清理浮动。亦可使用 或 来进行清理。 方法二:使用CSS的overflow属性 给浮动元素的容器添加overflow:hidde

  • 本文向大家介绍C#浮点,双精度,十进制,包括了C#浮点,双精度,十进制的使用技巧和注意事项,需要的朋友参考一下 示例 浮动 float是.NET数据类型的别名System.Single。它允许存储IEEE 754单精度浮点数。存在此数据类型mscorlib.dll,每个C#项目在创建它们时都会隐式引用该数据类型。 大致范围:-3.4×10 38至3.4×10 38 十进制精度:6-9个有效数字 记

  • 本文向大家介绍C# 清除cookies的代码,包括了C# 清除cookies的代码的使用技巧和注意事项,需要的朋友参考一下 不同的浏览器会把cookie文件保存在不同的地方   以下是C# WebBrowser控件cookies的存放路径   C:\Users\{你的帐号名}\AppData\Local\Microsoft\Windows\INetCookies   cookies文件格式请查看相

  • 问题内容: 据所有文件(尤其是文本文件)末尾所知,有一个 用于EOF或NULL字符的十六进制代码。当我们要编写程序 并读取文本文件的内容时,我们将发送读取函数,直到 收到EOF十六进制代码。 我的问题:我下载了一些工具来查看文本文件的十六进制视图。但我 看不到EOF(文件结尾/ NULL)或EOT(文本结尾)的任何十六进制代码 注意:我的输入文件是一个文本文件,其内容为“ “ EOF”的十六进制代

  • 据我们所知,在所有文件的末尾,特别是文本文件中,有一个十六进制代码表示EOF或NULL字符。当我们想要编写程序并读取文本文件的内容时,我们发送read函数,直到收到EOF hexcode。 我的问题:我下载了一些工具来查看文本文件的十六进制视图。但我看不到EOF(文件结尾/NULL)或EOT(文本结尾)的任何十六进制代码 ASCII/十六进制代码表: 这是十六进制查看器工具的输出: 注意:我的输入