- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要将一个数字范围划分为一些具有相同长度的段。但我无法决定哪种方式更准确。例如:
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 * double
或 int1 * 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
,但我不确定是什么双重标准说明了这种情况,如果它可能溢出或者它总是无穷大 - 但这绝对是一个问题。
所以,在这种情况下——第一种方法更准确。
如果 integer
是 long
或者 double
是 float
,事情可能会变得更复杂,因为有不能用 double
表示的长值,所以在这种情况下大的 double
值可能会失去准确性,在任何情况下 - 大 double
值不太准确。
结论:领域特定哪个更好。在某些情况下,第一种方法应该更好,而在某些情况下,第一种方法应该更好。它实际上取决于 int1
、int2
和 double
的值。
然而- AFAIK, double 操作的一般经验法则是保持计算尽可能小(不要创建巨大的数字然后减少它们,尽可能长时间地保持小)。此问题称为 loss of significant digits .
关于c# - 哪种方式更准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12281987/
我是一名优秀的程序员,十分优秀!