Tôi đang cố gắng tính toán độ dài của một Số nguyên trong Haskell, bằng cách sử dụng thực tế là độ dài bằng truncate (log10(x)+1)
.Lỗi cơ sở dữ liệu Haskell
Sử dụng Số nguyên tôi đã tạo:
len :: Integer -> Integer
len i = toInteger (truncate (logBase 10 (fromIntegral i)) + 1)
Thật không may, không phải tất cả các số có độ dài chính xác. Tôi đã thử một vài trường hợp khác nhau và nhận thấy rằng:
logBase 10 10 = 1.0
logBase 10 100 = 2.0
logBase 10 1000 = 2.9999..6
logBase 10 10000 = 4.0
logBase 10 100000 = 5.0
logBase 10 1000000 = 5.9999999
Có lý do nào tại sao logBase 10 1000
không trả lại 3.0? Làm cách nào để nhận được giá trị nhật ký chính xác cho 1000 trong cơ sở 10?
'logBase' được định nghĩa là 'log y/log x'; phân chia có lẽ là thủ phạm, trong khi 'log' sẽ đúng (đối với vòng tròn), sự phân chia chúng không nhất thiết phải là. –
@BartekBanachewicz Vì vậy, không có cách nào để có được kết quả chính xác? Đã thử sử dụng (log 1000)/(log 10), nhưng vẫn là 2.99996. Đoán rằng các giá trị log có thể được làm tròn xuống 1000 và tăng lên 10, do đó nó sẽ nhỏ hơn 3. – Pphoenix
Giả sử 'log' là không cần thiết, bạn có thể tránh hoạt động dấu phẩy động liên tục chia cho 10 (và công suất cao hơn) của 10). – kennytm