Tôi có một lỗi bí ẩn với thuật toán trừ số nguyên không dấu có độ dài khác nhau. Nó hoạt động cho hầu hết các cặp số, nhưng nếu n không nhỏ hơn số bit trong một ô thì (2^n +1)-(2^n - 1) <> 2
. Tôi không thể hiểu tại sao thuật toán không hoạt động.Thuật toán bị lỗi để trừ các số nguyên lớn trong Forth
Các số được lưu trữ trong các mảng trong hệ thống "tối ưu" (base = 2^bit), với các ô ít quan trọng nhất trong lowmem. Mảng tại AD1 là để được trừ vào mảng tại AD2, cả hai len cùng kích thước, và kết quả sẽ được lưu trữ tại AD2:
false borrow ! len 0
do i ad2 + @ borrow @ +
i ad1 + @ 2dup u< dup borrow !
if 1 swap 0 d- drop \ subtraction with borrow
else - \ subtraction without borrow
then i ad2 + ! cell
+loop
Lưu ý: Tôi nghĩ rằng lỗi xuất phát từ khi vay vốn từ một tế bào có chứa giá trị bằng không ...
Có lẽ ai đó có thể sửa thuật toán?