浮点数的精度是否从Python变为C?

时间:2018-09-10 12:30:36

标签: python c floating-point

我正在尝试缩放和标准化一些数据(原始数据的子集):

4576, 3687, 3786, 4149
4497, 3707, 3782, 4126
4449, 3712, 3787, 4097
4499, 3679, 3800, 4093
4497, 3660, 3857, 4139
4463, 3691, 3851, 4116
4393, 3712, 3782, 4108
4364, 3765, 3785, 4099
4400, 3846, 3822, 4152
4645, 3905, 3804, 4253

这些是每一列的平均值...

4400.60009766,  3274.76000977,  3234.88989258,  3402.25000000

...这是秤:

2164.33007812,  2516.58349609,  2280.71508789,  2321.07519531

要使用Python执行此任务,请使用fit()函数:

data_scaled = std_scale.transform(data)   # std_scale contains the mean and the scale values

在C语言中,我执行了以下操作:

void transform(uint16_t* in_data, unsigned size, double* mean, double* scale, double* out_data) {
   unsigned         i, j;

   for (i = 0; i < size; i++) {
      for (j = 0; j < 4; j++) {
          out_data[i][j] = ((double) in_data[i][j] - mean[j]) / scale[j];
      }
   }
}

但是我的某些结果的最低有效位数有所不同,这似乎可能是由于浮点精度的差异所致:

python结果

0.08104119   0.16380939   0.24163917   0.32172590
0.04454030   0.17175667   0.23988533   0.31181669
0.02236253   0.17374349   0.24207763   0.29932249   
0.04546437   0.16063046   0.24777760   0.29759914
0.04454030   0.15308055   0.27276975   0.31741756
0.02883105   0.16539884   0.27013901   0.30750835
-0.00351152   0.17374349   0.23988533   0.30406168   
-0.01691059   0.19480379   0.24120072   0.30018416
-0.00027727   0.22699028   0.25742370   0.32301840
0.11292173   0.25043476   0.24953143   0.36653271

C结果

0.08104120  0.16380938  0.24163917  0.32172590
0.04454030  0.17175667  0.23988534  0.31181670     
0.02236253  0.17374349  0.24207763  0.29932249
0.04546437  0.16063047  0.24777760  0.29759915  
0.04454030  0.15308055  0.27276976  0.31741755
0.02883105  0.16539884  0.27013901  0.30750835
-0.00351152  0.17374349  0.23988534  0.30406167
-0.01691059  0.19480378  0.24120071  0.30018416
-0.00027727  0.22699028  0.25742370  0.32301840
0.11292173  0.25043476  0.24953143  0.36653272

Python代码将数据表示为float32。我想念什么吗?

1 个答案:

答案 0 :(得分:2)

如果确实Python代码是在32位浮点中执行其计算,那么很可能这里的精度有所不同。 C语言没有指定浮点表示的详细信息,但是如今,很少遇到double不对应于IEEE 754二进制双精度格式(具有53的64位格式)的实现。位尾数。

但是也请注意,您观察到的差异是第7 个有效十进制数字。这是(32位)IEEE 754二进制单精度格式的精度的极限,甚至可能更高。您只能得到6-7个十进制数字。这种精度的差异可能仅由不同的运算顺序,不同的取整时间或某些类似的计算差异引起。如果确实以这种格式执行了至少一个计算,则没有理由期望这两个计算与您提供的精度相匹配。