C#中将Int32文字转换为浮点数的性能损失

3
在c#中,您可以将数字字面值定义为int或double。
    Double var1 = 56.1;
    int var2 = 51;

以下是字面值默认分配的类型。然而,我正在使用浮点数来表示位置、旋转等内容的游戏引擎。当将一个双精度字面量赋给浮点数,例如:float varFloat = 75.4;编译器会报错,提示需要将双精度字面量转换为浮点数,这是正确的。因此,需要将双精度字面量转换为浮点数,例如:float varFloat = 75.4f;。然而,当给定一个整型字面量时,整型会隐式转换为浮点数。例如:

    float varFloat = 44; // This is fine.

我的问题是编译器是否足够聪明,能够意识到44应该是一个浮点字面量?如果不能,那么每次访问这个字面量时,都会进行一次转换。在大多数情况下,这并不重要。但是对于高性能代码来说,如果整数被广泛使用而不是浮点数,则这可能成为一个潜在的问题(即使这只是一个小问题)。据我所知,没有办法将这些字面量转换为浮点数,而不需要经过大量源代码的修改,这显然是很费时间的。

那么,编译器是否会将整数字面量转换为浮点数字面量呢?如果不会,除了尝试避免这种浪费之外,还能做些什么来解决这个问题呢?


2
“处理能力浪费”这样的说法对于像字面量这样的语言结构来说是相当大胆的。阅读C# 语言规范将值得你花时间去了解C#的实际工作方式。 - user7116
2个回答

9
答案是肯定的。它足够聪明,知道这一点。
以下是一个简单程序的反汇编IL(感谢ILSpy),其中包含这样一个赋值语句。正如您可以从ldc.r4指令中看到的那样,没有进行任何转换:
.method private hidebysig static 
    void Main (
        string[] args
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 8 (0x8)
    .maxstack 1
    .entrypoint
    .locals init (
        [0] float32 x
    )

    IL_0000: nop
    IL_0001: ldc.r4 44
    IL_0006: stloc.0
    IL_0007: ret
} // end of method Program::Main

我不认为“按照标准”是非常聪明的说法。也许更合适的词是“方便”。 - user7116
4
“the standard is smart enough” 可以翻译为“这个标准足够智能”。 - Dave Markle

3

浮点数比双精度浮点数“小”

当您尝试将浮点数转换为双精度浮点数时,可能会丢失精度

参见:C:将double转换为float,保留小数点精度

C#也是同样的道理

当您写下以下代码时: float x = 5; 编译器将在编译时将其转换为 float x = 5.0;

没有性能问题


对于为什么它可以将5.0转换但不能将5.1转换,如果有一个合理的解释,那么就给它加上+1分。 - D Stanley
它将保留数量级,但不一定保留精度。 - user7116
这不是关于将双精度转换为浮点数的问题,而是关于将整数字面量赋值给浮点数是否会有性能影响。对于其他人来说仍然是有用的信息。 - Chris Beamond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接