什么双店?

时间:2018-02-10 12:46:13

标签: c++ double

我将值4 *cos( fmod( acos(2.0/4.0), 2*3.14159265) )作为double发送到此函数但输出为

2
1k1

这里有什么问题?

void convert_d_to_f(double n)
{
    cout<<n<<" ";

    double mantissa;
    double fractional_part;

    fractional_part = modf(n,&mantissa);
    double x = fractional_part;

    cout<<mantissa<<"k"<<fractional_part<<'\n';
}

2 个答案:

答案 0 :(得分:2)

问题是cout在打印时会截断和舍入两倍。您可以使用iomanip库打印所需的小数位数。

#include <iostream>
#include <cmath>
#include <iomanip>

void convert_d_to_f(double n)
{
    cout<<std::fixed<<std::setprecision(20); //number of decimal places you need to print to
    cout<<n<<" ";

    double mantissa;
    double fractional_part;

    fractional_part = modf(n,&mantissa);
    double x = fractional_part;

    cout<<mantissa<<"k"<<fractional_part<<'\n';
}

int main() {
    convert_d_to_f(4 *cos( fmod( acos(2.0/4.0), 2*3.14159265) ));
    return 0;
}

答案 1 :(得分:1)

对于所有实际意图和目的,您的号码n的评估结果为2。如果您希望它显示为1.9999999...等,请遵循Kapil的解决方案并将std::cout的浮点精度设置为多个小数位。如果您要走这条路线,请记住精度和准确度之间的差异。

话虽这么说,您的void convert_d_to_f(double n)功能正在复制std::frexp(double arg, int* exp)的功能,但是在您将结果打印到屏幕后,结果超出了范围。如果你想在计算它们之后使用你的指数和尾数值,那么你可以这样做。

#include <iostream>
#include <cmath>

int main()
{
    double n = 4 *cos( fmod( acos(2.0/4.0), 2*3.14159265) );
    std::cout << "Given the number " << n << std::endl;

    // convert the given floating point value `n` into a
    // normalized fraction and an integral power of two
    int exp;
    double mantissa = std::frexp(n, &exp);

    // display results as Mantissa x 2^Exponent
    std::cout << "We have " << n << " = "
        << mantissa << " * 2^" << exp << std::endl;

    return 0;
}