Tôi đã chơi bản dài gấp đôi của C99 quad precision. Đó là sự hiểu biết của tôi rằng (nền tảng cụ thể) numpy hỗ trợ long double và 128bit nổi.Numpy longdouble số học dường như không ở trong thời gian dài gấp đôi với chuyển đổi
Tôi đã chạy qua một thứ mà tôi không thể giải thích được.
Given:
>>> import numpy as np
Tính một con số đó sẽ đòi hỏi nhiều hơn 64 bit nhưng ít hơn 128 bit để biểu diễn như một số nguyên:
>>> 2**64+2
18446744073709551618 # note the '8' at the end
>>> int(2**64+2)
18446744073709551618 # same obviously
Nếu tôi calculate cùng một số trong C99 128 hơi dài gấp đôi, tôi nhận được 18446744073709551618.000000
Bây giờ, nếu tôi sử dụng đôi dài gấp gáp:
>>> a=np.longdouble(2)
>>> b=np.longdouble(64)
>>> a**b+a
18446744073709551618.0 # all good...
gì về những kết quả không chính xác:
>>> np.longdouble(2**64+2)
18446744073709551616.0 # Note '6'; appears 2**64 not done in long double
>>> np.longdouble(int(2**64+2))
18446744073709551616.0 # can't force the use of a Python long
>>> n=int(2**64+2)
>>> np.longdouble(n)
18446744073709551616.0
>>> np.longdouble(18446744073709551618)
18446744073709551616.0 # It really does not want to do '8' at the end
Nhưng, công trình này:
>>> np.longdouble(2**64)+2
18446744073709551618.0
Câu hỏi: Liệu NumPy có vấn đề chuyển đổi các giá trị một cách chính xác vào đôi lâu? Có điều gì tôi đang làm không chính xác?
Bạn đã cố gắng thực hiện tương tự trong C? Mã mà bạn đã liên kết không * không * làm những gì bạn đang cố gắng thực hiện với phần mềm. Trước tiên, hãy cố gắng tính toán '2 ** 64 + 2' làm số nguyên và * sau đó * gán nó thành' số double dài'. (Tôi có nghĩa là một cái gì đó như: 'dài dài val = (1 << 64) + 2; dài gấp đôi res = (dài gấp đôi) val') – Bakuriu
@ Bakuriu: Vâng, tôi đã cố gắng trong C. Có, tôi đã cố gắng' n = int (2 ** 64 + 2); np.longdouble (n) 'mà vẫn không thêm 2. – dawg
Sử dụng biểu thức' n = (2 ** x + 2); np.longdouble (n) == n' sẽ trả về false cho 'x> 53'. Có vẻ như một điểm kỳ lạ. – Daniel