浮动的NetCDF回退填充值的意义,9.9692099683868690e + 36?

时间:2017-05-05 18:08:07

标签: floating-point netcdf

NetCDF为每种类型定义default fill values。对于float和double,它使用9.9692099683868690e+36。起初我认为这可能是浮点数中可存储的最大值,但这可能是3.4028235e+38,大约相当于34倍。

NetCDF选择的数字是否有任何意义,或者它们是否也是随机数?

2 个答案:

答案 0 :(得分:1)

有趣的问题。一个真正的随机数不会起作用,因为它可能位于许多变量的典型值范围内,这会违反填充值的最佳实践。这就是为什么最佳实践是选择绝对幅度极大的数字,因此它不会与有效数据的动态范围相冲突。我检查了一次NC_FILL_FLOAT和NC_FILL_DOUBLE的属性,发现它们没什么特别之处。设置它们是有意义的,因为用户经常在float和double之间进行转换。这就留下了选择什么单一值的问题。在我看来,最佳选择是数量接近NC_FLOAT_MAX(或NC_FLOAT_MAX的负数),其具有适合压缩的位模式。由于许多数据集充满了缺失值,因此使用具有相同位的长连续字符串的数字将允许大多数算法更好地压缩这样的数据集。使用NC_FILL_FLOAT对数据集进行DEFLATE压缩非常好,因为DEFLATE很好,二进制中的NC_FILL_FLOAT是

9.9692099683868690e+36f = 0 1111100 111100000000000000000000

他们可以选择一个稍微可压缩的数字,例如,

-2.3509885615147286E-38f = 10000000111111111111111111111111

但他们没有,我也很好奇NC_FILL_FLOAT的来源。

答案 1 :(得分:0)

建议:找出该数字的HEX是什么。将其与内存的其他可能用途进行比较。

在一个旧的,现在已经不存在的机器中,未分配内存的填充程序是一个位模式,同时是一个NaN,一个会导致中止,坏地址等的指令。所以,无论你如何&#34 ;使用" RAM中的那个单元,会立刻发生坏事。