C++ C++;“类型”的计算;“长”;
我有一个内联函数做频率到周期的转换。计算精度必须使用类型long,而不是类型double。否则,可能会导致一些舍入错误。然后,该函数将结果转换回双精度。我想知道下面的代码中,哪一行可以将计算保持在long类型。无论参数栏是100、100.0还是33.3333C++ C++;“类型”的计算;“长”;,c++,types,precision,C++,Types,Precision,我有一个内联函数做频率到周期的转换。计算精度必须使用类型long,而不是类型double。否则,可能会导致一些舍入错误。然后,该函数将结果转换回双精度。我想知道下面的代码中,哪一行可以将计算保持在long类型。无论参数栏是100、100.0还是33.3333 double foo(long bar) { return 1000000/bar; return 1000000.0/bar; return (long)1000000/bar; return (long)1000000.
double foo(long bar)
{
return 1000000/bar;
return 1000000.0/bar;
return (long)1000000/bar;
return (long)1000000.0/bar;
}
我自己试过了,第四行也行。但我只是想知道在这种情况下类型转换的概念
编辑:
其中一个错误是1000000/37038=26,而不是26.9993
return 1000000/bar;
这将做一个长期的数学
return 1000000.0/bar;
这将做一个双精度的数学运算
return (long)1000000.0/bar;
这相当于第一个--1000000.0是一个双精度,但是在除法之前将其转换为long,所以除法将在long上完成
这将做一个长期的数学
return 1000000.0/bar;
这将做一个双精度的数学运算
return (long)1000000.0/bar;
这相当于第一个- 1000000是一个双,但是在分割之前将它抛到很长时间,所以分割将在long上完成。
< p>第一行(和第三个更冗长)将做数学,如<代码> long < /C> >(C++中的WHIHC总是截断任何结果),然后将积分值返回为一个加倍。我不理解你在关于<代码> Bar <代码>的问题是<代码> 33.3333代码>代码,因为这不是一个可能的代码>长值。 < P>第一行(第三个更详细地)将做数学,如<代码>长< /C> >(C++中的WHIHC总是截断任何结果),然后将积分值返回一倍。我不明白你在问题中所说的关于bar
是33.3333
,因为这不是一个可能的long
值。你提出的这个问题没有意义
bar
是一种整数类型,因此1000000/bar
肯定会小于1000000
,这可以用一个double
1来精确表示,因此在整数运算中执行计算无法提供更好的精度-实际上,您将得到整数除法,在这种情况下,bar
的任何值的精度都较低,因为它将截断小数部分。在long
到double
的转换中出现问题的唯一方法是在bar
到double
的转换中,但是如果它超过了double
的范围,则除法的最终结果将是0,这在整数算术中是一样的
仍然:
1000000/bar
在long
s之间执行除法:1000000是int
或long
,具体取决于平台,bar
是long
;如果需要,第一个操作数将提升为长
,然后执行整数除法
1000000.0/bar
(long)1000000.0/bar
在double
s之间执行除法:1000000.0
是double
文本,因此bar
在除法之前升级为double
(long)1000000/bar
等同于第一个:强制转换优先于除法,强制1000000
(长long
或int
)成为long
<代码>条是一个长
,执行长
之间的除法
1000000.0/bar
(long)1000000.0/bar
与上一个相同:1000000.0
是一个双精度
,但您将其强制转换为长型
,然后执行整数除法
1000000.0/bar
(long)1000000.0/bar
你提出的这个问题毫无意义
bar
是一种整数类型,因此1000000/bar
肯定会小于1000000
,这可以用一个double
1来精确表示,因此在整数运算中执行计算无法提供更好的精度-实际上,您将得到整数除法,在这种情况下,bar
的任何值的精度都较低,因为它将截断小数部分。在long
到double
的转换中出现问题的唯一方法是在bar
到double
的转换中,但是如果它超过了double
的范围,则除法的最终结果将是0,这在整数算术中是一样的
仍然:
1000000/bar
在long
s之间执行除法:1000000是int
或long
,具体取决于平台,bar
是long
;如果需要,第一个操作数将提升为长
,然后执行整数除法
1000000.0/bar
(long)1000000.0/bar
在double
s之间执行除法:1000000.0
是double
文本,因此bar
在除法之前升级为double
(long)1000000/bar
等同于第一个:强制转换优先于除法,强制1000000
(长long
或int
)成为long
<代码>条是一个长
,执行长
之间的除法
1000000.0/bar
(long)1000000.0/bar
与上一个相同:1000000.0
是一个双精度
,但您将其强制转换为长型
,然后执行整数除法
1000000.0/bar
(long)1000000.0/bar