设置操作的浮点精度
Set floating point precision for operations
我正在寻找一种方法来强制计算机计算具有一定数量有效数字的浮点运算。这纯粹是出于学习的原因,所以我不在乎结果的准确性损失。
例如,如果我有:
float a = 1.67;
float b = 10.0;
float c = 0.01
float d = a * b + c;
我希望每个数字都用3个有效数字表示,我希望看到:
d = 16.7;
不是:
d = 16.71;
到目前为止,我得到了一个可能的答案:限制浮点精度?
但是,使用该策略将每个浮点变量转换为一个具有我想要的精度的变量会使我的代码膨胀。然后对结果做同样的事情。
有没有自动修正精度的方法?
浮点数据类型是二进制浮点,即它们具有二进制数字的精度,并且实际上不可能在一般情况下准确地表示十进制值。因此,将操作截断到第一位的正确小数位数时会遇到一些问题。可行的方法是在每次操作后以n
位数的精度格式化浮点值(例如n == 3
),并将其转换回浮点值。这不会特别有效,但会起作用。为了避免将代码与相应的截断逻辑混在一起,您可以将所需的操作封装到一个类中,该类可以执行适当的截断结果的操作。
或者,您可以使用有效位和适当的基数10指数来实现必要的逻辑。有效值将限制在-999和999之间。实现这样的类可能需要更多的工作,但结果可能会更高效。
到目前为止,我得到了一个可能的答案:限制浮点精度?
阅读获得10票的第二个答案,而不是仅获得4票的已接受答案不要这么做。
当你在纸上计算时,你不想这样做,更不用说在电脑上了。这些中间计算最好至少对一个额外的有效数字进行,最好是两个或更多,比基础数据显示的数字。您可以截断到最后的数据所指示的精度。我们在纸上这样做的唯一原因是,人们不太善于处理大量数字。这是一种短路操作,根据人们的计算(或误判)方式进行调整。
通过对中间计算进行四舍五入,你所做的就是为错误的蔓延创造一个机会,并使计算机速度减慢,通常会慢很多。不要担心那些中间结果的额外精度。只需使用即可在输出时显示所需精度的结果。
相反的问题有时也适用。您可能需要担心中间结果的精度损失。有时,精度的损失意味着从浮点运算变为双精度运算,或从双精度运算变为可变精度运算(这是慢速)。
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 对字符串进行位操作
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 在 Windows/C++ 上使用多进程应用程序的高精度定时操作
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 以毫秒级精度对日期和时间进行操作
- 操作顺序以最大限度地提高精度
- 将 int 转换为双精度以执行 std::complex <double>的"*"操作
- 设置操作的浮点精度
- 如何在 c++ 下对尾数和双精度或浮点数的指数部分进行操作(快速)
- 在c++中将包含二进制操作的字符串转换为双精度类型