【发布时间】:2014-01-18 23:38:16
【问题描述】:
我已经实现了class NaturalNum 来表示“无限”大小(最大 4GB)的自然数。
我还实现了class RationalNum 以无限准确地表示有理数。它存储有理数的分子和分母,两者都是NaturalNum 实例,并在执行用户发出的任何算术运算时依赖它们。
精度“下降一定程度”的唯一地方是在打印时,因为小数点(或非小数点)后出现的位数有限制(由用户提供)。
我的问题涉及class RationalNum 的构造函数之一。即,构造函数接受double 值,并计算相应的分子和分母。
我的代码如下,我想知道是否有人看到了更准确的计算方法:
RationalNum::RationalNum(double value)
{
if (value == value+1)
throw "Infinite Value";
if (value != value)
throw "Undefined Value";
m_sign = false;
m_numerator = 0;
m_denominator = 1;
if (value < 0)
{
m_sign = true;
value = -value;
}
// Here is the actual computation
while (value > 0)
{
unsigned int floor = (unsigned int)value;
value -= floor;
m_numerator += floor;
value *= 2;
m_numerator *= 2;
m_denominator *= 2;
}
NaturalNum gcd = GCD(m_numerator,m_denominator);
m_numerator /= gcd;
m_denominator /= gcd;
}
注意:以“m_”开头的变量是成员变量。
谢谢
【问题讨论】:
-
将浮点数分解为符号、尾数和指数,然后你就有足够的信息来准确地表示它了。
-
我不会冒着在不同编译器(或 CPU 架构)上使用不同 FP 表示的风险吗?
-
@barakmanos 您是为 IBM 大型机还是 Cray 超级计算机编程?如果您不是,那么请忘记非 IEEE 754 表示。
-
@Pascal Cuoq:谢谢。如您所见,我不依赖任何 FP 表示。
-
m_numerator 和 m_denominator 有哪些类型?
标签: c++ floating-point double rational-numbers