2014-10-01 48 views
-2

我寫了這個功能,一個double轉換爲一個分數返回一個字符串:獲取部分從雙

function getFraction(x: double):string; 
var h1, h2, k1, k2, y, a, aux : double; 
begin 

    //Setup the values 
    h1 := 1; 
    h2 := 0; 
    k1 := 0; 
    k2 := 1; 
    y := x; 

    //Generates the fraction 
    repeat 
    begin 
    a := floor(y); 
    aux := h1; 
    h1 := a*h1+h2; 
    h2 := aux; 
    aux := k1; 
    k1 := a*k1+k2; 
    k2 := aux; 
    y := 1/(y-a) ; 
    end; 
    until (abs(x-h1/k1) > x*0.000001); 

    //Output 
    Result := FloatToStr(h1) + '/' + FloatToStr(k1); 
end; 

然後,我把它叫做這樣:Edit7.Text := getFraction(x);其中x是雙。我使用的拉撒路,我總是有這樣的錯誤:

enter image description here

我相信,上面的代碼中並沒有邏輯的麻煩,因爲它,我已經在上週實施了一個項目中的Java類成爲(code) 。

我錯過了什麼?我的Delphi項目的完整代碼可以找到here

+1

請問您能否展示真實的代碼。這不是。它無法編譯。然後請顯示導致此浮點錯誤的輸入值。也許你正在將'0'傳遞給函數。你的功能似乎也不是很有用。例如,它將0.5轉換爲「0/1」。 FWIW可能幾乎是不可能的。 – 2014-10-01 21:16:32

+3

在許多方面描述,[如何將浮點數轉換爲可讀的分數?](http://stackoverflow.com/q/95727/576719)。 – 2014-10-01 21:31:02

+0

@LURD謝謝。有趣。 – 2014-10-02 04:42:54

回答

1

對於它的價值,你的重複循環是錯誤的方法。您正在用repeat/until替換java do/while - 必須反轉才能使其工作。

爲了避免被零除,只需檢查並打破循環。這樣可以避免崩潰,但我沒有證實它會始終產生正確的答案,儘管它可以用於以前致命的輸入,如0.250.5

repeat 
    begin 
     a := floor(y); 
     aux := h1; 
     h1 := a * h1 + h2; 
     h2 := aux; 
     aux := k1; 
     k1 := a * k1 + k2; 
     k2 := aux; 
     if (y - a = 0) or (k1 = 0) then break; //!! 
     y := 1/(y - a) ; 
    end; 
    until (Abs(x - h1/k1) <= x * 0.000001); // Here <= instead of > 
+0

發現問題現在我得到了我的錯誤,你給我的代碼完美的工作! – 2014-10-01 21:43:20

3

肯定會發生錯誤的位置:

y := 1/(y-a); 

y-a評估爲0,那麼這將導致被零除錯誤。當您將0傳遞給函數時會發生這種情況。

或者當您評估h1/k1時,​​的值爲零。再次,這是一個浮點異常。

即使你陷入這些情況,我也不能讓這個函數返回任何對我來說似乎遠爲明智的東西。所以,一旦你解決了異常情況,那麼你將有更多的工作。

我確信你可以在調試器中完成這項工作,即使你不能通過閱讀代碼來完成。調試器會告訴你哪一行產生了錯誤,然後它只是檢查表達式中操作數的值。

+0

感謝您的建議,我現在嘗試着解決它。無論如何,Java版本完美工作,並且0.5變爲1/2(這是正確的)。我必須通過Delphi – 2014-10-01 21:25:17