Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;“类型”的计算;“长”;_C++_Types_Precision - Fatal编程技术网

C++ C++;“类型”的计算;“长”;

C++ 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.

我有一个内联函数做频率到周期的转换。计算精度必须使用类型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.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

  • C++标准所代表的C标准,对于代码<2> <代码> >(<代码> dBLIGHOD/<代码>)和至少<代码> 10 ** 37 < /代码>,在出界之前(表示代码> dBLMax Max 1010EXP <代码>)(C99,附件E,4),要求至少10个十进制数字。
    你提出的这个问题毫无意义


    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
    

  • C++标准所代表的C标准,要求在代码“<代码>双< /代码> S(<代码> dBLIGHODIO/COD> >)和至少<代码> 10 ** 37 <代码>前的最小10个十进制数字,作为在范围之外的可代表性的幂(<代码> dBLMax Max 1010Exp < /代码>)(C99,附件E),