Page 1 of 1

Wie man FFT -basierte Faltung mit langen Doppel/Float128s schnell und genau durchführt

Posted: 07 Feb 2025, 02:25
by Guest
Auf meinem Linux -System habe ich: < /p>

Code: Select all

np.finfo(np.float128)
info(resolution=1e-18, min=-1.189731495357231765e+4932, max=1.189731495357231765e+4932, dtype=float128)
< /code>
Das ist also ein 80-Bit-Doppel. Ich möchte eine Faltung zwischen zwei einigermaßen langen Arrays von NP.Float128 
s durchführen. scipy.signal.convolve funktioniert mit methode = 'Direct' , gibt jedoch die falsche Antwort für method = 'fft' an. Hier ist ein Spielzeugbeispiel: < /p>

Code: Select all

a = np.array(['1.e+401', '1.e+000', '1.e+401', '1.e+000'], dtype=np.float128)

convolve(a, a, mode='full', method='direct')
array([1.e+802, 2.e+401, 2.e+802, 4.e+401, 1.e+802, 2.e+401, 1.e+000],
dtype=float128) # correct
convolve(a, a, mode='full', method='fft')
array([1.e+802, 0.e+000, 2.e+802, 0.e+000, 1.e+802, 0.e+000, 0.e+000],
dtype=float128) # wrong
Ich habe versucht, die Faltung mit Pyfftw von Grund auf neu zu implementieren, aber es gab immer noch die falsche Antwort. Um eine Flucht zu machen, die dem folgenden schnell und genau mit FFTS ähnelt: < /p>

Code: Select all

a = np.array([1e401, 1e000, 1e401, 1e000] * 10000, dtype=np.float128)
convolve(a, a)
Wie kann das geschehen?