减少C++中双精度的数字
Reducing the digits of a Double in C++
我需要一个函数来降低双精度(位数)。
我需要它进行计算,而不是在屏幕上输出。
到目前为止,我所拥有的是:
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
操作,你永远不会失去精度。
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 使用浮点数和双精度数的非常小数字的数学
- 如何在 c++ 中添加两个大的双精度数字
- 字符串和双精度的麻烦,等值后再得到一个数字
- 避免双精度数字的四舍五入
- 有没有办法将数字作为字符串,并在不使用浮点数或双精度数的情况下将其四舍五入到确切的位数
- 将协议缓冲区中的二进制双精度数组转换为 JavaScript 数字
- 2 个给定数字之间的双精度密度
- 如何在不丢失第一位数字的情况下打印出双精度值
- 双精度数字程序意外值
- 从字符串转换为数字大于 std::numeric_limit<double>::d igits10 的双精度
- 非分数数字对双精度数字的影响
- 减少C++中双精度的数字
- 将双精度转换为精度超过 5 位十进制数字的字符串
- 使用自定义数字将字符串转换为双精度无法按预期工作
- 小数点后的数字,用于双精度变量/C++计算
- C++ 浮点数与双精度数的精度数字
- 使用浮点数、双精度数和长双精度数后,控制台中不显示所有数字
- 查找双精度数组中的第一个数字
- C++ 仅使用数字(双精度)的读入文件