【发布时间】:2011-07-11 08:20:02
【问题描述】:
问题
给定两个整数 a, b, a示例输入
3 7
345 800
112 990
53 122样本输出
.428751
最后 6 位数字永远重复。
.43125
此扩展终止。
.113
最后 2 位数字永远重复。
.4344262295081967213114754098360655737704918032786885245901639
最后 60 位数字永远重复。
注意:这个问题来自 ProgFest 编程竞赛。
如果我们应用这三个定理,这个问题的算法并不难:
但是,我面临的问题是使用定理 1 中给出的递归公式计算 alpha 时的四舍五入。显示函数定义如下:
void displayFraction( int n, int d, int length ) {
std::cout << ".";
double alpha = static_cast<double>( n ) / d;
for( int i = 1; i <= length; ++i ) {
int c = std::floor( 10.0 * alpha );
alpha = 10.0 * alpha - c;
std::cout << c;
}
}
我的输出是:
.4344 2622 9508 1967 3732 7807 5683 6291 4025 7835 3881 8359 3750 0000 0000 0
问题输出在哪里:
.4344 2622 9508 1967 2131 1475 4098 3606 5573 7704 9180 3278 6885 2459 0163 9
如您所见,直到第 16 位数字都是正确的。所以我的问题是,在这种特殊情况下执行计算时如何防止截断数字?有什么想法吗?
【问题讨论】:
-
为什么投反对票?询问如何获得更好的精度来解决舍入误差似乎足够有效?
-
我不明白为什么要投 2 票?至少给我一些 cmets,这样如果你不喜欢我的问题,我可以改进我的答案。
-
您不能为此使用浮点数。 Double only has precision of about 16 digits.
-
@Asgeir:谢谢。有什么推荐的算法吗?
-
定理1 是算法。只是你对它的实现是不稳定的。请记住,整数数学中的除法会自动为您做一个底...
标签: c++ algorithm numbers double