Wie man FFT -basierte Faltung mit langen Doppel/Float128s schnell und genau durchführt
Posted: 07 Feb 2025, 02:25
Auf meinem Linux -System habe ich: < /p>
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>
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>
Wie kann das geschehen?
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
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
Code: Select all
a = np.array([1e401, 1e000, 1e401, 1e000] * 10000, dtype=np.float128)
convolve(a, a)