在 C# 中“转换”浮点数为双精度值
Posted
技术标签:
【中文标题】在 C# 中“转换”浮点数为双精度值【英文标题】:"Converting" float to double in C# 【发布时间】:2012-05-30 23:12:57 【问题描述】:我有一个粒子生命周期的属性(我正在模拟粒子系统),它是一个浮点值,因为我也将它用于透明度(alpha 是浮点数)。我已经阅读了有关将 float 转换为 double 的问题,并意识到这是一个很大的问题,所以我可能无法将 float 转换为 double。问题是我想尝试从生命变量计算粒子的路径,例如:
particle.x += particle.xi;
particle.xi = Math.Sin(life);
注意:生命值在开始时为 1.0f,然后递减为 0(如果它 但是Sin想要双倍的价值……我们又回到了起点。 因此,一种解决方案可以将 life 属性的类型更改为 double,当我将其用于透明度时,我只会将此 double 转换为 float,这应该不是什么大问题(我猜)。 但我的问题是是否有任何其他方法可以做到这一点,因为双倍也需要更多的内存(我不知道在这种情况下更多意味着什么 - 我想更多倍,假设我将有 500 个粒子,每个粒子都会有这个属性)。 我只需要从这个 float 属性中计算 sin 值。
那么有可能吗?我对记忆的担忧重要吗?
【问题讨论】:
【参考方案1】:这应该可行:
particle.x += particle.xi;
particle.xi = (float) Math.Sin(life);
它不会“使用更多内存”,它只是在重新计算时将值临时转换为双精度值,然后在存储值时将其转换回浮点数。
更详细一点:Math.Sin 需要一个双精度浮点数,但浮点数可以毫无损失地转换为这个更高的精度,所以它只是“神奇地工作”(一个 隐式 强制转换从浮动到双)。但是,要将生成的双精度数转换回浮点数,您将降低数字的精度,因此编译器(不知道您是否可以接受)不会这样做,除非您强制它(通过使用 (float)
这是一个 explicit 从 double 转换为 float)。
【讨论】:
好吧,我认为问题在于我将浮点数放在 Math.Sin 上,而忽略了particle.xi 也是浮点数,我应该预料到两个相同的问题,但在第一种情况下它不是问题原因 Sin 接受浮动 :) 感谢您的解释。它真的很有帮助。哦,这个愚蠢的小错误......以上是关于在 C# 中“转换”浮点数为双精度值的主要内容,如果未能解决你的问题,请参考以下文章
比较一个 32 位浮点数和一个 32 位整数而不强制转换为双精度,当任何一个值都可能太大而无法完全适合另一种类型时
C语言atof()函数:将字符串转换为double(双精度浮点数)