2016-01-14 113 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,因爲它具有更多精度位。 (它只支持整數,所以它不需要位指數)。