我的基本目标是减去两个应该是等效的浮点数。考虑一下:-
float x=1;
float a=x/30-x/40;
float b=x/30;
b-=x/40;
std::cout<<a-b<<std::endl;
我应该得到零。但我没有。相反,我得到了大约 10^(-10) 的极少数数量。
现在,有两种选择:-
首先,我想用有理表达式代替分数(即处理分子和分母),然后将最终的有理表达式转换为分数。我通过 Boost.rational 做到了这一点。我使用 cpp_int 来存储分子和分母,因为分子和分母可能会变得很大。它工作正常。但问题是我正在制作的程序需要很多时间。我认为这是因为必须处理巨大的整数。
其次,有人建议我尝试定点算术。我不太擅长。所以,我不确定定点算术是否也会给出正确的答案?我在想的是这个-> 假设我希望我的减法结果正确到第 50 个精度。因此,通过将小数点乘以适当的 10 次方,我得到小数点左侧的 50 位数字。删除小数部分并将其转换为 cpp_int。我用两个花车做这个。然后对这些 cpp_int 进行减法运算。两个问题:- 首先,我无法将 cpp_float_dec_50 转换为 cpp_int。Boost 不允许直接进行这种(有损)转换。其次,我对这种方法完全没有信心。
所以,最后两个问题:- 如何将 cpp_float_dec_50 转换为 cpp_int?到目前为止,在问题中提出的上下文中,哪种方法是最好的两个减去两个浮点数?
谢谢。很抱歉,如果其中任何一个问题被认为是非常愚蠢或愚蠢的问题。我还在学习。