「費氏數列產生器」不會對較大的費氏數值進行四捨五入 — 每一個項都是透過 BigInt 遞迴產生,並以精確的十進位整數寫出。兩個起始值為 F(0) = 0 和 F(1) = 1,之後的每一個值都是前兩項的整數和。由於 BigInt 可以容納任意位數,產生器即使在普通 JavaScript 數字已無法準確計數的位置上,也能完整保留十進位表示法。例如 F(100) 會呈現為 354224848179261915075,而非以近似值或科學記號表示。這對程式碼審核、回歸測試套件中的測試固定資料,以及任何只要在最後一位數差一就會在數月間悄悄破壞下游比較的任務都很重要。這個小工具對每個要求的項只執行一次加法,從不呼叫 Binet 閉合式解,更不會將執行中的配對轉換為浮點數運算,而這正是瀏覽器式費氏工具中常見的隱性四捨五入來源。由於每一步都是針對 BigInt 運算元的整數運算,因此永遠不會截斷任何數字、不會近似任何尾數,可見的文字永遠符合 OEIS A000045 中記錄的遞迴真實值。

為什麼大多數費氏工具會將較大的數值四捨五入
當線上的費氏數產生器用錯了數學方法時,就會對較大的數值進行四捨五入。兩種實作模式幾乎造成你在其他工具中看到的每一次「近似」:
- 使用原生 Number 型別的浮點遞迴,一旦數值超過 Number.MAX_SAFE_INTEGER,就會喪失整數精度。
- Binet 閉合式解,依賴黃金比例的冪次與平方根 — 兩者在浮點運算中都只能以近似方式表示。
當使用上述任一方法計算 F(100) 或更大的數值時,結果會在最後幾位與真實整數相差好幾個單位,即使顯示出來的數字看起來合理。工具絕不會告知你發生過四捨五入。數字就是錯的,與之比較的下游程式碼也會繼承這個錯誤。費氏數列產生器 透過對每一項執行一次 BigInt 加法、且完全不碰浮點運算,來避免這兩種模式。
F(78) 的安全整數界線
JavaScript 的 Number 型別只能精確表示到 Number.MAX_SAFE_INTEGER,也就是 2^53 − 1 = 9007199254740991。費氏數很快就會越過這個界線。F(78) 仍在安全範圍內,但 F(79) 已大於安全整數上限,從那之後任何以純 Number 儲存數列值的工具,都無法再保證相鄰整數可以區分 — 而這正是索引式數列的核心目的。BigInt 透過配置數值所需的位元數來繞過這個界線,因此一旦將執行中的配對以 BigInt 儲存,無論結果有多少位數,每一次加法都保持精確。
| 作法 | 如何計算每一項 | 四捨五入從何處介入 |
|---|---|---|
| 浮點 Number | 將前兩個 Number 值相加 | 超過 F(78) 後,超出 Number.MAX_SAFE_INTEGER |
| Binet 閉合式 | 於浮點下計算 (φⁿ − (−1/φ)ⁿ) / √5 | φ 的冪次與 √5 為無理數,僅能以近似表示 |
| BigInt 遞迴 | 將兩個 BigInt 值相加,每項一次加法 | 永遠不會介入 — 在每個位置都精確 |
BigInt 遞迴如何讓每一位數都精確
費氏數列產生器以 current = 0n 和 next = 1n 作為一對起始值。對每一個要求的索引,先記錄目前的值,再將配對推進為 next 與 current + next。由於每一步都是針對 BigInt 運算元的整數加法,因此不涉及任何四捨五入、截斷或指數運算。輸出的每一列都直接將 BigInt 轉為十進位文字,不加分隔符,也不使用科學記號,因此可見字串就是遞迴所產生的字面十進位整數。
實作刻意排除 Binet 公式。閉合式在數學上很優雅,但在浮點下計算 φⁿ 時,一旦 n 夠大,所產生的近似值在最後幾位會與整數真值不同。迭代式遞迴完全不離開整數範圍,從而避開這個問題。因此完整的索引輸出保留了所有前導數字,下游檢查將你的程式碼輸出與產生器輸出進行比對時,會在每一個字元上都一致,而非僅僅在開頭幾位一致。
產生一份精確的費氏數列清單
- 在瀏覽器中開啟費氏數列產生器。
- 輸入介於 1 到 1,000 之間的整數項數。項數為 1 時僅回傳 F(0)。項數為 20 時回傳 F(0) 到 F(19)。輸入的是列數,而非你想落腳的索引。
- 產生數列並閱讀摘要行,其中會說明產生的項數與最終索引,因此最後一個項目的位置永遠不會模糊。
- 驗證幾個具代表性的索引,例如 F(0) = 0、F(1) = 1、F(10) = 55,以及摘要中出現的最後一個索引。
- 複製以換行符分隔的精確清單,若瀏覽器封鎖剪貼簿動作,則手動選取可見文字。
驗證輸出確實未經四捨五入
有三個訊號可以告訴你顯示的值未經四捨五入:
- 摘要會同時列出項數與最終索引。若最終索引等於項數減一(因為從零開始編號),則各列與你輸入的內容對齊。
- 較大的值以純十進位整數顯示,沒有 "e" 記號,也沒有省略號。F(100) 顯示為 354224848179261915075,而非 3.542248481792619e20,也非 3.5422484817926191e+20。
- 最後幾位不會是補上的零。浮點四捨五入傾向產生結尾數字收斂為可預測模式的值;BigInt 結果則永遠不會,因為數字直接來自整數加法。
若你正在檢查會列印費氏項的程式碼,請將產生器中較大的某一列貼到你的測試式中,並確認逐字元相符。只要有一位數不同,錯的就是產生端,而非參考端。
1,000 項上限的實際意義
1,000 項的上限是基於產品效能的界線,並非數列在數學上的極限。F(999) 含有數百個十進位數字,完整的索引清單大到需要捲動。這個固定上限防止意外產生巨大的 DOM 與剪貼簿承載量,同時仍涵蓋課堂作業、展示、測試固定資料,以及大多數程式設計範例。若需要數百萬項或專門的數論分析,具備批次儲存能力的專屬程式環境才是合適的工具。
無效的項數 — 分數、帶正負號、科學記號、分隔符、零、負數、空輸入,以及超過 1,000 的值 — 會被拒絕而非悄悄截斷或向下四捨五入。產生器絕不會默默將其截斷為較小的值;它會告訴你輸入無效,並清空先前的輸出。編輯項數會清除舊結果,因此較早的數列不會留在畫面上與新的未處理輸入混淆。
精確的較大費氏數列清單何處可用
一份保證精確、帶索引的十進位數列有以下幾個實際用途:
- 將 Python、Java、Verilog 或 JavaScript 中的任意精度實作,與位數已知精確的可信參考進行比對。
- 建立測試固定資料,使其預期輸出不會因為原本產生它們的工具中的四捨五入錯誤而悄悄偏移。
- 在課堂上示範遞迴,完全不引用 Binet 公式或任何浮點近似。
- 將簡短清單複製到筆記、簡報或文件中,使可見的數字必須與印出的文字完全一致。
這個小工具不會測試某個獨立數字是否屬於此數列、不會分解因數、不會計算費氏質數、不會計算與黃金比例的比值、不會繪製螺旋,也不會聲稱任何自然或財務規律遵循這些數字。它只產生由 F(0) = 0、F(1) = 1,以及 n ≥ 2 時 F(n) = F(n−1) + F(n−2) 所定義的索引數列,完全符合 NIST 數學函數數位圖書館 與 OEIS A000045 的記錄。所有驗證、加法、格式化與複製都在本機進行,因此項數與產生的數列永遠不會被傳輸出去。
若你正從這個瀏覽器工具轉換到程式碼,並希望在不同的執行環境中,於 F(78) 之後仍維持相同的逐位精確行為,如何在 Python 中取得 F(78) 之後的費氏數列 這篇指南,會在一個預設整數型別恰好是無界的語言中,逐步說明相同的 BigInt 風格作法。
若你正在權衡選項,大字隨機整數挑選器 對此有詳細說明。