我正在用 Python 开发一个系统,它复制了用 LabWindows 编写的另一个系统。设计的一部分涉及计算周期图,它返回一个十进制数组。然后我将此数组添加到 DataFrame 中以进行进一步计算。然而,在此过程中,小数精度被截断为 7 或 9 位,导致精度损失。
我需要保证至少15位小数的精度。为了确认该问题,我执行了以下步骤:
如何确保Python在整个过程中保持较高的精度(至少15位小数)?
import numpy as np
from scipy.signal import periodogram
N = 256 # Number of samples
t = np.arange(N) # Time array
signal = (np.sin(2 * np.pi * 0.05 * t) +
np.sin(2 * np.pi * 0.1 * t) +
np.sin(2 * np.pi * 0.25 * t))
fs = 1.0 # Sampling frequency
frequencies, spectrum = periodogram(signal, fs=fs, window='hann', scaling='spectrum')
np.savetxt('py_spectrum.txt', spectrum, header='spectrum Data')
#define N 256
double t[N], signal[N];
for (int i = 0; i < N; i++)
{
t[i] = i; // Discrete time index
signal[i] = sin(2 * 3.141592 * 0.05 * t[i]) +
sin(2 * 3.141592 * 0.1 * t[i]) +
sin(2 * 3.141592 * 0.25 * t[i]);
}
// Apply Hann Window and calculate Spectrum
HanWin(signal, N);
Spectrum(signal, N);
}
为了在使用周期图时保持更高的精度,请考虑更改以下内容:
使用
float64
,它提供15-16位小数。
import numpy as np
signal = np.array(signal, dtype=np.float64)
// you can also use float128 if supported
decimal
模块如果需要任意精度,则使用十进制模块:
from decimal import Decimal, getcontext
# Set precision to 15 decimal places
getcontext().prec = 15
# Convert the signal array to Decimal
signal = [Decimal(s) for s in signal]
import pandas as pd
pd.set_option('display.float_format', '{:.15f}'.format)
我希望这有帮助!