在 C# 中“转换”浮点数为双精度

本文关键字:浮点数 双精度 转换 | 更新日期: 2023-09-27 18:35:53

我有一个粒子寿命的属性(我正在模拟粒子系统),这是一个浮点值,因为我也用它来提高透明度(alpha是浮点数)。我读过有关将浮点数转换为双精度的问题,并意识到这是一个很大的问题,所以我可能无法将浮点数转换为双精度。问题是我想尝试从生命变量计算粒子的路径,例如:

particle.x += particle.xi;
particle.xi = Math.Sin(life);

注意:生命值在开始时为 1.0f,然后减小到 0(如果它<0.0f,我会重新初始化粒子并将寿命设置为 1.0f)。
但是罪想要双重价值...我们又回到了起点。因此,一种解决方案可以将生命属性的类型更改为双倍,当我将其用于透明度时,我将只是将双倍转换为浮点数,这应该不是大问题(我猜)。
但我的问题是是否有其他方法可以做到这一点,因为双倍也会花费更多的内存(我不知道在这种情况下更多意味着什么 - 我想更多,假设我将有 500 个粒子,每个粒子都有这个属性)。我只需要以某种方式从这个浮点属性中计算罪恶值。

那么可能吗?我对记忆的担忧重要吗?

在 C# 中“转换”浮点数为双精度

这应该有效:

particle.x += particle.xi; 
particle.xi = (float) Math.Sin(life); 

不会"使用更多内存",它只是在重新计算值时暂时将值转换为双精度值,然后在存储值时将其转换回浮点数。

详细地说:Math.Sin 需要一个双精度,但浮点数可以转换为这种更高的精度而不会丢失,所以它只是"神奇地工作"(从浮点数到双精度的隐式强制转换)。但是,要将生成的双精度转换回浮点数,您将降低数字的精度,因此编译器(不知道这是否可以接受)不会这样做,除非您强制它这样做(通过使用 (float)这是从双精度到浮点的显式强制转换)。