gpt4 book ai didi

c# - 哪种方式更准确?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:49:22 24 4
gpt4 key购买 nike

我需要将一个数字范围划分为一些具有相同长度的段。但我无法决定哪种方式更准确。例如:

double r1 = 100.0, r2 = 1000.0, r = r2 - r1;
int n = 30;
double[] position = new double[n];
for (int i = 0; i < n; i++)
{
position[i] = r1 + (double)i / n * r;
// position[i] = r1 + i * r / n;
}

关于 (double)int1/int2 * doubleint1 * double/int2。哪种方式更准确?我应该使用哪种方式?

更新

以下代码将显示差异:

double r1 = 1000.0, r2 = 100000.0, r = r2 - r1;
int n = 300;
double[] position = new double[n];
for (int i = 0; i < n; i++)
{
double v1 = r1 + (double)i / n * r;
double v2 = position[i] = r1 + i * r / n;
if (v1 != v2)
{
Console.WriteLine(v2 - v1);
}
}

最佳答案

免责声明:我将作为示例给出的所有数字并不准确,但显示了幕后发生的事情的原理。

让我们来看两个案例:

(1) int1 = 1000, int2= 3, double = 3.0第一种方法将为您提供:(1000.0/3) * 3 == 333.33333 * 3.0 == 999.999...
而第二个将给出 (1000 * 3.0)/3 == 3000/3 == 1000
在这种情况下——第二种方法更准确

(2) int1 = 2, int2 = 2, double = Double.MAX_VALUE
第一个会产生 (2.0/2) * Double.MAX_VALUE == 1 * Double.MAX_VALUE == Double.MAX_VALUE
虽然第二个将给出 (2 * Double.MAX_VALUE)/2 - 这将导致(在 Java 中)为 Infinity,但我不确定是什么双重标准说明了这种情况,如果它可能溢出或者它总是无穷大 - 但这绝对是一个问题。
所以,在这种情况下——第一种方法更准确

如果 integerlong 或者 doublefloat,事情可能会变得更复杂,因为有不能用 double 表示的长值,所以在这种情况下大的 double 值可能会失去准确性,在任何情况下 - 大 double 值不太准确。

结论:领域特定哪个更好。在某些情况下,第一种方法应该更好,而在某些情况下,第一种方法应该更好。它实际上取决于 int1int2double 的值。
然而- AFAIK, double 操作的一般经验法则是保持计算尽可能小(不要创建巨大的数字然后减少它们,尽可能长时间地保持小)。此问题称为 loss of significant digits .

关于c# - 哪种方式更准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12281987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com