我通过我的python终端(在Enthought Canopy IDE中)检查了指针的大小
import ctypes
print (ctypes.sizeof(ctypes.c_voidp) * 8)
Run Code Online (Sandbox Code Playgroud)
我有一个64位的架构,并且工作numpy.float64得很好.但我不能用np.float128?
np.array([1,1,1],dtype=np.float128)
Run Code Online (Sandbox Code Playgroud)
要么
np.float128(1)
Run Code Online (Sandbox Code Playgroud)
结果是:
AttributeError: 'module' object has no attribute 'float128'
Run Code Online (Sandbox Code Playgroud)
我正在运行以下版本:
sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)
Run Code Online (Sandbox Code Playgroud) 我正在对合成数据进行实验(例如拟合正弦曲线),我在 pytorch 中遇到了非常小的错误。一如约2.00e-7。我正在阅读有关机器精度的信息,它似乎非常接近机器精度。我怎么知道这是否会导致问题(或者它是否已经存在,例如我无法区分不同的错误,因为它们是“机器零”)。
错误:
p = np.array([2.3078539778125768e-07,
1.9997889411762922e-07,
2.729681222011256e-07,
3.2532371115080884e-07])
m = np.array([3.309504692539563e-07,
4.1058904888091606e-06,
6.8326703386053605e-06,
7.4616147721799645e-06])
Run Code Online (Sandbox Code Playgroud)
让我感到困惑的是,我尝试将我认为的数字添加到较小的数字中,以便它没有返回任何差异,但它确实返回了一个差异(即我尝试a+eps = a使用eps = smaller than machine precision):
import torch
x1 = torch.tensor(1e-6)
x2 = torch.tensor(1e-7)
x3 = torch.tensor(1e-8)
x4 = torch.tensor(1e-9)
eps = torch.tensor(1e-11)
print(x1.dtype)
print(x1)
print(x1+eps)
print(x2)
print(x2+eps)
print(x3)
print(x3+eps)
print(x4)
print(x4+eps)
Run Code Online (Sandbox Code Playgroud)
输出:
torch.float32
tensor(1.0000e-06)
tensor(1.0000e-06)
tensor(1.0000e-07)
tensor(1.0001e-07)
tensor(1.0000e-08)
tensor(1.0010e-08)
tensor(1.0000e-09)
tensor(1.0100e-09)
Run Code Online (Sandbox Code Playgroud)
我希望一切都为零,但事实并非如此。有人可以向我解释发生了什么吗?如果我的损失接近,1e-7我应该使用double而不是float? 谷歌搜索似乎 single 是 float afaik 的精度。
如果我想使用双打,什么是缺点/优点 …