gpt4 book ai didi

c++ - 将 large double 除以 large int

转载 作者:搜寻专家 更新时间:2023-10-31 00:37:15 28 4
gpt4 key购买 nike

我正在编写物理模拟代码,最近我遇到了异常结果。我设法调试了我的程序,错误出在用大整数除以大 double ,形式如下:

cout << my_large_double/my_large_int << endl

my_large_double 的阶数是 -10^{9},我的两个整数的乘积是 10^{9} 的阶数,返回的是 1 阶的正值。我通过在分母中强制转换为 double 来修复它:

cout << my_large_double/( (double)my_large_int1*my_large_int2) << endl

但我想了解错误是从哪里来的,通常有什么方法可以防止它们发生?

更新:我在第一个问题中跳过了一个重要的细节:int 实际上是两个 int 的乘积。

最佳答案

这完全取决于表达式的编写方式。

如果你这样写:

my_large_double / my_large_int1 / my_large_int2

那么它相当于:

(my_large_double / my_large_int1) / my_large_int2

这应该会给你相当准确的结果; my_large_int1 在第一次除法之前被提升为 double,而 my_large_int2 在第二次除法之前被提升为 double

如果你这样写:

my_large_double / (my_large_int1 * my_large_int2)

然后乘法以两个整数变量的类型完成,并且根据它们的值,您可能会发生溢出(这可能会给您带来比数学乘积小得多的值——尽管严格来说是有符号整数的行为溢出是未定义的)。

要记住的重要一点是,在大多数情况下,每个 C 表达式都是独立有效地求值的;它的类型不受它出现的上下文的影响。表达式 my_large_int1 * my_large_int2 是整数乘法,即使结果是浮点除法的操作数或分配给浮点变量也是如此。

任何操作数都是整数的运算都是整数运算。如果一个操作数是 double 而另一个是 int,则 int 操作数被提升为 double

即使这样:

double temp = my_large_int1 * my_large_int2;
... my_large_double / temp ...

将在使用结果初始化temp 之前执行整数乘法,并且:

my_large_double / (double)(my_large_int1 * my_large_int2)

有同样的问题。

如您所见,解决方案是将一个或两个整数操作数转换为 double:

my_large_double / ((double)my_large_int1 * (double)my_large_int2)

(为了对称和清晰起见,您也可以同时转换它们。)

关于c++ - 将 large double 除以 large int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20222737/

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