小编Ala*_*lan的帖子

浮点文字与浮点变量的奇怪编译器行为

我注意到C#编译器浮动舍入/截断有趣的行为.也就是说,当浮点字面值超出保证的可表示范围(7个十进制数字)时,则a)显式地将float结果转换为float(语义上不必要的操作)和b)将中间计算结果存储在局部变量中都会改变输出.一个例子:

using System;

class Program
{
    static void Main()
    {
        float f = 2.0499999f;
        var a = f * 100f;
        var b = (int) (f * 100f);
        var c = (int) (float) (f * 100f);
        var d = (int) a;
        var e = (int) (float) a;
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);
        Console.WriteLine(d);
        Console.WriteLine(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

205
204
205
205
205
Run Code Online (Sandbox Code Playgroud)

在我的计算机上的JITted调试版本中,b的计算方法如下:

          var b = (int) (f * 100f);
0000005a  fld         dword ptr [ebp-3Ch] 
0000005d  fmul        dword ptr ds:[035E1648h] 
00000063  fstp        qword …
Run Code Online (Sandbox Code Playgroud)

c# compiler-construction floating-point

7
推荐指数
1
解决办法
864
查看次数

标签 统计

c# ×1

compiler-construction ×1

floating-point ×1