c ++数据类型及其表示方式

时间:2016-09-29 13:09:55

标签: c++

我一直在使用Babylonian平方根算法,从我的编程类介绍中分配。 该程序工作正常,并提供非常准确的答案。我的问题源于行中发生的奇怪事情(猜测!=结果) 我写了这句话来检查这两个术语,并且一旦它们相同,就打破循环。但是,如果您输入50个作为起始编号,则循环在发生之前检查两个相同的数字三次,而不是一次。这是因为有更多的数字在后台被碾压,双数据类型无法显示?我知道double可以达到15位小数。我希望我能以一种可以理解的方式措辞,如果有人需要澄清,只要问一下。 PS-如果有人有提示帮助我的代码更清洁,请告诉我,我正在尝试学习如何格式化我的代码尽可能可读。

#include <iostream>

using namespace std;

int main()
{
    double input,       // Users number
           guess = 2,   // First guess, always 2 at beginning
           result,      // altered guess, becomes guess 1 when repeated
           r;           // input divided by guess

    int steps = 1,      // keeps track of step number, for debugging
        loop = 1;       // controls continue loop

    string error_1 = " Warning: input is negative, please pick a new one";

    while (loop == 1)
    {
        cout << "--Babylonian Square Root Algorithm--" << endl;
        cout << "Type a positive number to find its square root: ";
        cin >> input;

        if (input >= 0)
        {
            while (guess != result) // test here for within 1%
            {
                r = input / guess;
                result = (guess + r) / 2;
                // DEBUG
                cout << "-------" << endl;
                cout << " Step # " << steps << endl;
                cout << "-------" << endl;
                cout << " R) " << r << endl;
                cout << " Guess) " << guess << endl;
                cout << " Result) " << result << endl;
                steps++;

                guess = result;
                result = (guess + r) / 2;
                cout << result << " is the approximate square root of " << input << endl;
                //DEBUG
                cout << " Steps required: " << steps - 1 << endl;
            }
            else
            {
                cout << error_1 << endl;
            }
            cout << "Continue?  (Yes = 1, No = 0)" << endl;
            guess = 2;
            result = 0;
            steps = 1;
            cin >> loop;
            cout << "------------------------------------------------------" << endl;
        }
        return 0;
    }
}

1 个答案:

答案 0 :(得分:2)

&#34;猜&#34;和&#34;结果&#34;是&#34;双&#34;类型,它具有比默认cout浮点数字显示长度更高的精度。

你认为数字是相同的,但事实并非如此。从小数点开始,你可以看到差异。

解决方案1:将cout十进制数显示范围更改为更长的值,以便您可以看到数字实际上是不同的,因此while循环没有中断。    在代码开头使用cout.precision(17);

解决方案2:更改guess&amp;的数据类型结果为&#34;浮动&#34;