C ++以任何方式以完全精度打印最大双(8字节)值而不将其更改为long long?

时间:2017-03-29 22:56:19

标签: c++ calculator

使用' cout'打印值时出现问题。我希望看到价值" 9223372036854775807"在控制台,但我只是继续得到" 9223372036854775800"负值也是如此。我还希望用户输入此值作为最大值,并希望保留小数位。

---------------这些将是最小值和最大值

double al = scnd_num_min(num1, Oprt);
al = al * (-1);
double ah = scnd_num_max(num1, Oprt);

--------------这就是我打印这些值的地方

cout << "Please enter a value within a range of: " << "\n" << fixed << al;
cout << " and " << ah << " : ";

这是获得价值的一个功能:

    double scnd_num_max(double num1, char Oprt)
    {
    double max1 = 9223372036854775807;
    double max2 = 9223372036854775806;
    double min1 = -9223372036854775806;
    switch(Oprt)
    {
    case '+':
        if (num1 <= 0)
            return max1;
        else
            return (max1 - num1);
    case '-':
        if (num1 >= -1)
            return max1;
        else
            return ((max1 - (num1 * (-1)))+1);
    case '*':
        if ((num1 < min1) || (num1 > max2))
            return 1;
        else if (num1 == 0)
            return max2;
        else if (num1 > 0)
            return (max2 / num1);
        else
            return (max2 / (num1 * (-1)));
    case '/':
        return max2;
    }
}

完全相同的是负值。

1 个答案:

答案 0 :(得分:0)

double是64位宽,但它不能保存long long(也是64位)可以容纳的每个值,因为浮点数由符号位,指数和尾数组成。 double的尾数是52bit宽,所以你可以确定每个52bit(实际上是53个因为符号位)宽整数可以在不损失精度的情况下存储,其余的你可能会失去精度。

编辑:顺便说一下,double max是1.79769e + 308,见this link