C ++会在不需要的时候进行双向舍入

时间:2014-10-22 20:37:40

标签: c++ types double

我正在用C ++编写一个用于距离公式的程序。 x1 = 0 y1 = 0 x2 = 1 y2 = 1的答案应该是1.14左右,但打印出来的答案是2.00。每个变量都存储为double我不知道这里出了什么问题。这是我的代码,谢谢你的帮助!!

//  main.cpp
//  Chap6_42
//
//  Created on 10/21/14.
//

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
double distance(double,double,double,double); //distance prototype


int main()
{
    double d = 0;

    double x1 = 0; //coordinate x1
    double x2 = 0; //coord x2
    double y1 = 0; //coord y1
    double y2 = 0; //coord y2




    cout << "Enter four cords (x1,y1,x2,y2) to find the distance between them " << endl;
    cout << "x1 = ";
    cin >> x1;
    cout << "y1 = ";
    cin >> y1;
    cout << "x2 = ";
    cin >> x2;
    cout << "y2 = ";
    cin >> y2;

    d = distance (x2,x1, y2,y1); //calls to distance function, performs computations

    cout << "The distance is " << fixed << setprecision(2) << showpoint << d << endl;



    return 0;
}
double distance(double x2,double x1,double y2,double y1) //distance function header
{

    return sqrt(pow(x2-x1,2.0)) + sqrt(pow(y2-y1,2.0)); //distance function computations


}
                                                //function definition

5 个答案:

答案 0 :(得分:2)

为什么你认为答案是1.14左右?举个例子,它应该返回2.0

sqrt((pow(2.0 - 1.0, 2.0))) + sqrt((pow(2.0 - 1.0, 2.0)))
sqrt((pow(1.0, 2.0))) + sqrt((pow(1.0, 2.0)))
sqrt(1.0) + sqrt(1.0)
1.0 + 1.0
2.0

多田!

如果您正在计算函数名称所暗示的距离,则需要调整公式。

return sqrt(pow(abs(x2 - x1), 2.0) + pow(abs(y2 - y1), 2.0));

答案 1 :(得分:2)

你的计算错了。您只需拨打sqrt两次,只需在整个金额上拨打一次。

return sqrt(pow(x2-x1,2.0) + pow(y2-y1,2.0));

答案 2 :(得分:2)

你的公式错了。

您写道:

sqrt(pow(x2-x1,2.0)) + sqrt(pow(y2-y1,2.0));

应该是:

sqrt(pow(x2-x1,2.0) + pow(y2-y1,2.0));

无论如何,不​​要在那里使用pow,而是手动繁殖,这可能(可能)更快,更准确。

sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );

此外,通常您可以使用平方距离而不是距离来进行小的性能提升。

答案 3 :(得分:1)

你和pythagorus不同意如何计算距离

答案 4 :(得分:-1)

鉴于您打算使用“pow”出于某种深奥的原因,您的代码应该是

return sqrt(abs(pow(x2-x1,2.0)) + abs(pow(y2-y1,2.0)));

return sqrt(pow(x2-x1,int(2)) + pow(y2-y1,int(2)));

如果你要编程,你可能需要大量的数学。你需要知道你将要使用的算法(即使是像Pitagora那样的简单算法)。另外一个带有双精度的舍入误差也不会改变结果(除非你使用了一些糟糕的条件算法,但Pitagora的情况并非如此。