0

我对使用内置运算符的原始类型有疑问。float我所有的运算符都适用于除and之外的所有数据类型(un)signed long long int

为什么即使乘以一也是错误的?此外,为什么+10和给出与、、和-10相同的数字。+1-1/1*1

选择该数字461168601是因为它适合 maxfloat和 max signed long long int

运行以下代码并得到以下输出:

fmax  : 340282346638528859811704183484516925440
imax  : 9223372036854775807
i     : 461168601
f     : 10
f2    : 1

461168601 / 10 = 46116860
461168601 + 10 = 461168608
461168601 - 10 = 461168608

461168601 * 1 = 461168608
461168601 / 1 = 461168608
461168601 + 1 = 461168608
461168601 - 1 = 461168608

下面的代码可以在这里运行。

#include <iostream>
#include <sstream>
#include <iomanip>
#include <limits>

#define fmax std::numeric_limits<float>::max()
#define imax std::numeric_limits<signed long long int>::max()

int main()
{

    signed long long int i    = 461168601;
    float f = 10;
    float f2 = 1;
    std::cout << std::setprecision(40);
    std::cout <<"fmax  : " << fmax  << std::endl;
    std::cout <<"imax  : " << imax  << std::endl;
    std::cout <<"i     : " << i    << std::endl;
    std::cout <<"f     : " << f    << std::endl;
    std::cout <<"f2    : " << f2   << std::endl;
    std::cout <<std::endl;
    std::cout << i << " / " << f << " = " << i / f << std::endl;
    std::cout << i << " + " << f << " = " << i + f << std::endl;
    std::cout << i << " - " << f << " = " << i - f << std::endl;
    std::cout <<std::endl;
    std::cout << i << " * " << f2 << " = " <<i * f2 << std::endl;
    std::cout << i << " / " << f2 << " = " << i / f2 << std::endl;
    std::cout << i << " + " << f2 << " = " << i + f2 << std::endl;
    std::cout << i << " - " << f2 << " = " << i - f2 << std::endl;
}
4

2 回答 2

0

挖了一些,发现了这篇文章

铸造打开了自己的蠕虫罐头。您必须小心,因为您的浮点数可能没有足够的精度来保存整个整数。32 位整数可以表示任何 9 位十进制数,但 32 位浮点数只能提供大约 7 位的精度。因此,如果您有大整数,则进行此转换会破坏它们。值得庆幸的是,双精度数具有足够的精度来保存整个 32 位整数(再次注意浮点精度和整数动态范围之间的类比)。此外,数字类型之间的转换、从浮点数到整数或浮点数和双精度数之间的转换也会产生一些开销。

因此,基本上一旦一个数字的整个部分达到大约七位数,就float开始移动数字以保持该数字的整个部分大约七位数。当发生这种小数位移动时,数字开始达到浮点不准确。

于 2015-11-25T18:05:18.167 回答
0

4611686018427387904该错误是由and 1or之间的差异太大引起的10。您永远不应该对具有这种差异的数字求和,因为两个最接近的浮点数之间的实际差异随着指数值的增长而增长。

当添加两个浮点数时,首先它们与相同的指数值(较大的那个)对齐,因此在操作之前您有 eg1e10并且1e-10在对齐之后您有1e10并且0e10结果是1e10.

于 2015-11-25T16:27:03.510 回答