【发布时间】:2021-11-01 00:02:39
【问题描述】:
我正在尝试在 C++ 中实现我自己的定点算术,以便(稍后)进行更高精度的计算。我在想类似的东西
class FixedPoint
{
int intPart;
unsigned long long fracPart[some number];
}
我认为如果我 - 例如加法 - 首先添加两个 fracPart[某个数字],如果它们溢出,则将 1 添加到 fracPart[某个数字 - 1] 等等。
但我坚持将双“d”转换为这样的类。 intPart = d 当然有效。然后做
double Temp = d - intPart;
给我小数部分。但是我如何正确地将它分配给 fracPart[0]?在十进制中,如果 long long 正好有 20 位,我可以只做 Temp * 100000000000000000000,这样 0.14 就变成 14000000000000000000。但是如果在二进制中,我取 d 的尾数位(53/54 位),将它们分配给 fracPart[0 ](64 位),添加隐藏位并将其左移 13 位(或 12,因为隐藏位),值是错误的。到目前为止,我在网上找到的任何内容都没有帮助...
【问题讨论】:
-
intPart = d可能会溢出;d可能比INT_MAX大得多 -
忘掉分数吧,你还有更多基本问题要解决。您是否知道
doubles 可以存储超过int精度的数值。例如,当double的值为1e100时,您希望intPart发生什么?那是 1 后跟一百个零。尝试将其放入您的intPart不会很好。 -
当然浮点值的范围比定点值更大。但是在范围内,定点值可能更有用。这就是我问的原因。
-
在我的天真中,我将小数部分(我将使用
std::modf)乘以我的十进制精度并将其存储在一个截断其余部分的 int 中。对于整数部分,我会使用std::numeric_limits来查看double值是否实际上在可表示范围内 -
将
Temp乘以 2^64(或long long中的位数)。
标签: c++