为什么double乘以float会在C ++(VS)中返回一个double

时间:2016-07-02 06:55:28

标签: floating-point precision

编辑(第三次): 到目前为止回答答案,让我澄清一下:

  • @LưuVĩnhPhúc在我原来的表达中敏锐地指出,
  

算术运算的精度由精度决定   不太精确的操作数。

我应该使用准确度而不是精确度。即。

  

算术运算的准确性由精度决定   操作数不太准确。

是的,我不小心使用了精确度而不是精确度,并在我的许多论点中继续使用它。我为我的愚蠢错误和相应的混淆道歉。

所以问题重申:

例如:

Debug

然后,变量测试是双重类型。

我对这个选择感到困惑。因为从数学上讲,算术运算的准确性取决于精度较低的操作数的准确性。在我们的情况下,3.f在最多8位数后已经无法保证其准确性,将测试存储为双精度的点是什么,可能会产生误导性的15位精度?

我的猜测是它可能与指数有关,但在这种情况下,结果是300,它不会超出浮点范围。或者有历史原因吗?

非常感谢,

我为我的愚蠢而再次道歉。

总结目前的答案: 1,是的,这是关于范围的; 2,当double * float-> double时,会有很多截断。

5 个答案:

答案 0 :(得分:3)

在两种类型之间执行操作时,C ++将返回具有最大精度的值。这可以防止溢出和其他奇怪的事情,可能会缩小转换。

例如,float可以容纳~3.4×10 38 ,而double可以容纳~1.8×10 308 < / SUP>。如果您将3.0f的浮点乘以1e100的两倍,您可能希望获得约3e100的结果,不是吗?另一方面,如果您将其转换为float,则会获得inf

你可以说它应该能够说明,但是编译器如何知道编译时结果是否适合float或者是否需要double

值得记住的是,所有float值都可以转换为double而不会损失精度,但相反(显然)不是真的。

总结一下:这是计算机科学,而不是数学。

答案 1 :(得分:0)

  

从数学上讲,算术运算的精度取决于精度较低的操作数的精度。

不,不是。从数学上讲,乘法的精度定义为操作数精度的乘积。例如考虑1 * 1.5。结果是1.5,而不是1。

答案 2 :(得分:0)

这是由于大多数编程语言中内置的隐式类型转换,而不仅仅是C ++。有关详细信息,请查看此链接:
http://www.cplusplus.com/doc/tutorial/typecasting/

答案 3 :(得分:0)

根据 C ++编程语言(第4版)

  

§10.3.1:算术运算符的结果类型由一组称为“通常的算术转换”(§10.5.3)的规则决定。总体目标是产生“最大”操作数类型的结果。

我认为这样做是为了不丢失存储在更大类型中的任何数据。

  

§10.5.3:这些转换是在二元运算符的操作数上执行的,以将它们带到一个公共类型,然后将其用作结果的类型:

     
      
  1. 如果任一操作数的类型为long double,则另一个操作数将转换为long double。      
        
    • 否则,如果任一操作数为double,则另一个操作数转换为double。
    •   
    • 否则,如果任一操作数为float,则另一个操作数转换为float。
    •   
    • 否则,将对两个操作数执行整体促销(§10.5.1)。
    •   
  2.   
  3. 否则,如果任一操作数为long long unsigned,则另一个操作数转换为unsigned long long。      
        
    • 否则,如果一个操作数是long long int而另一个是unsigned long int,那么如果long long int可以表示unsigned long int的所有值,则unsigned long int将转换为long long int ;否则,两个操作数都转换为unsigned long long int。否则,如果任一操作数长对齐无符号,则另一个操作数转换为无符号长整数。
    •   
    • 否则,如果一个操作数是long int而另一个是unsigned int,那么如果long int可以表示unsigned int的所有值,则unsigned int将转换为long int;否则,两个操作数都将转换为unsigned long int。
    •   
    • 否则,如果任一操作数为long,则另一个操作数转换为long。
    •   
    • 否则,如果任一操作数是无符号的,则另一个操作数将转换为无符号。
    •   
    • 否则,两个操作数都是int。
    •   
  4.         

    这些规则将无符号整数转换为可能更大的实现定义的有符号整数。这是避免混合无符号和有符号整数的另一个原因。

答案 4 :(得分:0)

您可能对accuracy and precision

有误解

C ++中的浮点类型没有不同的精度。它们具有固定的位数,您不能以1位精度存储1。它总是 53位精度(假设IEEE-754加倍)。与1.5或1.766569471相同,无论您在文本中写了多少位数

计算机中的浮点类型不会在类型中存储精度,因此1.51.50000001.500000000000完全相同...