使SAS处理非常小的数字而不进行舍入

时间:2015-10-22 15:04:19

标签: sas sas-iml

我有一系列大(4或5位)数字,我需要提升到-1的功率。因为这些数字都很大,所以当它们被提升到那个能量时,它们显然会非常小。当我在SAS中使用(使用元素运算符)时,输出中的所有数字都会舍入(?)到-1。所以我只得到输出的很多减号。

这确实是四舍五入的结果吗?我可以通过以某种方式格式化输出来解决这个问题吗?如果是这样,这是什么语法?再一次,很抱歉询问这些简单的事情,我对SAS来说是全新的。

代码:

proc iml; 
  use sasdata.have; 
  read all var {Distance} into D; 
  print D; 
  Dmin = -1##D; 
  print Dmin;
quit;

2 个答案:

答案 0 :(得分:1)

你的问题是你将-1提高到5000(或其他)的力量,而不是相反。

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch
from matplotlib import mlab

# Sampling information
Fs = 200.
t0 = 0
tf = 10
t = np.arange(t0, tf, 1. / Fs)

# Pure sinusoidal signal
f0 = 27.
y = np.cos(2 * np.pi * f0 * t)

# Add in some white noise
A_noise = 1e-3
y += (A_noise * np.random.randn(len(y)))

nperseg = 64    # even
# nperseg = 65  # odd

if nperseg > len(y):
    raise ValueError('nperseg > len(y); preventing unintentional zero padding')

# Compute PSD with `scipy.signal.welch`
f_welch, S_welch = welch(
    y, fs=Fs, nperseg=nperseg, noverlap=(nperseg // 2),
    detrend=None, scaling='density', window='hanning')

# Compute PSD with `matplotlib.mlab.psd`, using parameters that are
# *equivalent* to those used in `scipy.signal.welch` above
S_mlab, f_mlab = mlab.psd(
    y, Fs=Fs, NFFT=nperseg, noverlap=(nperseg // 2),
    detrend=None, scale_by_freq=True, window=mlab.window_hanning)

fig, axes = plt.subplots(2, 1, sharex=True)

# Plot PSD computed via both methods
axes[0].loglog(f_welch, S_welch, '-s')
axes[0].loglog(f_mlab, S_mlab, '-^')
axes[0].set_xlabel('f')
axes[0].set_ylabel('PSD')
axes[0].legend(['scipy.signal.welch', 'mlab.psd'], loc='upper left')

# Plot relative error
delta = np.abs(S_welch - S_mlab)
avg = 0.5 * np.abs(S_welch + S_mlab)
relative_error = delta / avg
axes[1].loglog(f_welch, relative_error, 'k')
axes[1].set_xlabel('f')
axes[1].set_ylabel('relative error')

plt.suptitle('nperseg = %i' % nperseg)
plt.show()

答案 1 :(得分:0)

没关系,我想我知道是什么造成了这种情况。问题是操作的顺序!当我将-1 ## D更改为D ## - 1时,我所有数字到-1的奇怪变形停止了,我终于得到了我期望的类型的答案。对不起,我现在非常紧张并且时间紧迫,因此我的代码中出现了这个愚蠢的错误。