减少C++中双精度的数字

Reducing the digits of a Double in C++

本文关键字:数字 双精度 C++ 减少      更新时间:2023-10-16

我需要一个函数来降低双精度(位数)。

我需要它进行计算,而不是在屏幕上输出。

到目前为止,我所拥有的是:

double setDigits(double _number, int _digits)
{
double tenth = pow((double)10,_digits);
_number *= tenth;
_number = floor(_number);
_number /= tenth;
return _number;
}

调用setDigits(sqrt(2),3)给出 1.413999999999999,而不是我想要的 1.414。

我能做什么?

我能做什么?

不幸的是,根本问题没有任何问题:在您的平台中,1.414 没有确切的双重表示。您无法使用"1.414"进行计算,因为您不能将"1.414"放置在double中的任何位置。

例如,请参阅 http://www3.ntu.edu.sg/home/ehchua/programming/java/DataRepresentation.html 。

您可以做的是以最大精度保持您的号码,并以降低的精度显示它。您需要计算机器精度并在计算过程中跟踪误差。

因此,您将使用1.4139999999999997,最后得到答案,例如41.99999137;您将显示

printf("The answer is %.3fn", theAnswer);

或者你可以改变平台(编译器,或数学库,或浮点表示,例如在支持的情况下使用long double),但请记住,你可以得到1.414,代价是得到,比如说,1.873错误(把它作为1.87299999999或1.87300000001),计算将或多或少有相同的错误。

您可以使用整数算术,将初始数字乘以 1,000,000(并得到 1414000)或其他合适的刻度,然后在末尾除法。但是,整数具有最大边界。

还有一些任意精度库使用不同的内部表示形式,并允许您以所需的方式指定精度,例如 GMP ( http://gmplib.org/)。当然,使用它比指定更困难

op1 = 6.0;
op2 = 7.0;
theAnswer = op1 * op2;

处理速度也较慢,但结果很好 - 或者和你告诉他们一样好。

以下行无效。

double tenth = pow((double)10,_decimals); //_decimals is not declared
_number = floor(_digits); //should be floor(_number)

更正后的函数为

double setDigits(double _number, int _digits)
{
double tenth = pow((double)10,_digits);
_number *= tenth;
_number = floor(_number);
_number /= tenth;
return _number;
}

这是一个演示。

我不知道你可能不检查这个答案,但其他人会 我是C ++的新手,但我找到了一种方法来做到这一点

double Point::norm()

{

return (double)floor((sqrt(pow(px,2)+pow(py,2)+pow(pz,2))*1000))*0.001;

}

我使用它,但你可以写自己的数学课来为你做这件事

double setDigits(double _number, int _digits)
{
double tenth = pow((double)10,_digits);
int result = (_number * tenth) + 0.5; 
double aux = result / tenth;
return aux;
}

尝试以下十分之一 = 1000;

result = 1413,9999999999999 * 1000 +0,5
result = 1414,4......
result = 1414

试试这个:

double setDigits(double _number, int _digits)
{
double tenth = pow((double)10,_digits);
return floor(_number * tenth + 0.5)/tenth;
}
std::cout<<setDigits(sqrt(2),3);

Output: 1.414

您可以创建一个中间类,该类在内部管理数据int,但输入和输出double

class TruncatedDouble
{
private:
int value_;
public:
TruncatedDouble(double d) : value_((int)(double * 1000)) {}
void SetValue(double d) {value_ = (int)(double * 1000);}
double GetValue() {return (double)value_ / 1000;}
};

您还必须重载所有常用运算符,但这很容易。例:

TruncatedDouble& operator+=(const TruncatedDouble& rh) {value_ += rh.value_;}

等等。这个类实际上会很快,因为你用int而不是double操作,你永远不会失去精度。