Gram w C99's quad precision długo podwójnie. Rozumiem, że numpy (zależnie od platformy) obsługuje long double i 128 bitów.Numpy longdouble arytmetyczna nie wydaje się być długa podwójna z konwersją
Przeszedłem przez coś, czego nie potrafię wyjaśnić.
Dane:
>>> import numpy as np
Obliczyć liczbę, która wymaga więcej niż 64 bitów, lecz mniej niż 128 bitów reprezentuje jako liczba całkowita:
>>> 2**64+2
18446744073709551618 # note the '8' at the end
>>> int(2**64+2)
18446744073709551618 # same obviously
Jeśli calculate ten sam numer, C99 128 trochę długo podwójnie, dostaję 18446744073709551618.000000
Teraz, jeśli używam numpy długi podwójny:
>>> a=np.longdouble(2)
>>> b=np.longdouble(64)
>>> a**b+a
18446744073709551618.0 # all good...
Co o tych nieprawidłowych wyników:
>>> 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
Ale to działa:
>>> np.longdouble(2**64)+2
18446744073709551618.0
pytanie: Czy numpy mają problemy przeliczania wartości poprawnie na długich deblu? Czy coś robię nieprawidłowo?
Czy próbowałeś zrobić to samo w C? Kod, który łączysz * nie * rób tego, co próbujesz zrobić z numpy. Spróbuj najpierw obliczyć '2 ** 64 + 2' jako liczbę całkowitą i * następnie * przypisz ją do' długiego podwójnego '. (Mam na myśli coś takiego: 'long long val = (1 << 64) + 2; long double res = (long double) val') – Bakuriu
@Bakuriu: Tak, próbowałem w C. Tak, próbowałem' n = int (2 ** 64 + 2); np.longdouble (n) 'który nadal nie dodaje wartości 2. – dawg
Używanie wyrażenia' n = (2 ** x + 2); np.longdouble (n) == n' zwróci false dla 'x> 53'. Wygląda na dziwny punkt przełomowy. – Daniel