2015-10-06 13 views
6

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?

Trả lời

3

Có, chúng ta nên giữ dấu hiệu khi mượn. Giải pháp đơn giản là chỉ để sử dụng D- ở khắp mọi nơi:

0 borrow ! 
len 0 DO 
    ad2 I +  @ 0 
    borrow  @ 0 D- 
    ad1 I +  @ 0 D- 
    ABS borrow ! 
    ad2 I +  ! 
cell +LOOP 

Hoặc một số biến thể (cơ thể của vòng lặp):

borrow @ S>D 
    ad2 I + @ 0  D+ 
    ad1 I + @ 0  D- 
    borrow ! 
    ad2 I + ! 

Có lẽ, đúng cách là sử dụng ý tưởng của M+ operation để thay thế.

Các vấn đề liên quan