2016-01-14 78 views
-1

当我输入l = 1时r = 999999999999999999 k = 1000000000 r的值变为 1.0e + 18.如何获取实际变量输入? 这是我的代码:实际值不作为变量存储在变量中时

#include<stdio.h> 
#include<iostream> 
#include<iomanip> 
using namespace std; 
#define ll long long 
int main() { 
    double l, r,k; 
    cin >> l >> r >> k; 
    double i = 1,c=0; 
    while (i<=r) 
    { 
     if (i >= l) { 
      cout <<fixed<<setprecision(0)<< i << " ";c++; 
     } 
     i *= k; 
    } 
    if (c == 0)cout << -1; 
    cout << endl; 
} 
+1

''define'确实伤害了我的眼睛... – MSalters

+0

如果你想保留输入,请使用字符串而不是数字类型。 –

回答

6

你输入的r,999999999999999999值,具有18位精度。然而,一个double变量可以表示少于16位的位;因此,您的价值被取整为1.0e + 18。只是为了好玩,试着给你的价值加1,然后将它与原始价值进行比较 - 你会发现它们是平等的。不仅仅是“接近” - 相等。没错 - r == r + 1

关于浮点数的一些错综复杂的教程,我建议你take a look at this tutorial

祝你好运。

+0

所以,问题仍然存在,但感谢您的帮助和链接。 –

+0

如果你想让它像你期望的那样工作,你可以尝试改变'r'的类型为'long long'。然而,“如何处理大小数字而不损失精确度”这一根本问题依然存在。要处理这个问题,您需要考虑一个类库,它可以处理超过内置硬件关联类型提供的精度或规模的数字。一个这样的类库就是[TTMath库](http://www.ttmath.org/)。祝你好运。 –

0

要回答第二个问题,您可以将999999999999999999存储为long long,因为它具有更多精度位。 (它只支持整数,所以它不需要位指数)。