2016-08-23 630 views
0

在fortran中,我必须将经纬度舍入小数点后的一位数字。Fortran - 要舍入到小数点一位

我使用gfortran编译器和NINT功能,但下面不工作 -

rlons(i,j) = nint(rla2rlarot*10.0)/10.0 
+0

真正简短的答案是,你不能这样做。浮点表示是不精确的,并且不能保证浮点除以十(或四舍五入为十进制)可以精确地表示您正在使用的任何大小的浮点类型。这仅用于打印或显示? – talonmies

+0

@talonmies - 不,它不打印或显示。我有一个输入netcdf文件,只有一位数字后小数点。我修改了经度,我想把它写回netcdf文件。 – gansub

+0

那么,你不能用浮点来做到这一点。您需要使用固定点或小数类型代替 – talonmies

回答

1

有没有办法做到你的要求。根本问题是您所需的舍入值不一定能够用浮点表示。

例如,如果有一个值10.58,这正是表示为1.3225000×2^3 =在IEEE754 FLOAT32 10.580000。

当这一轮重视到小数点后一位数(无论你选择这样做),结果将是10.6,不过10.6并没有一个确切的表示。在float32中,最接近的表示是1.3249999 x 2^3 = 10.599999。因此,无论您如何处理舍入,都无法将10.6完全保存在float32值中,也无法将其作为浮点值写入netCDF文件。

+0

这取决于“将其写回文件”的含义。如果它是一个格式(F6.1,....),那么它会工作。 – Holmz

+0

@Holmz:注意我写了[* netCDF文件*](http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html) – talonmies

0

是的,它可以做!上面的“接受”答案在其有限的范围内是正确的,但是在Fortran(或其他各种HGL)中实际可以实现的内容是错误的。

唯一的问题是,如果像使用F(6.1)写入的内容失败,您愿意支付什么价格?

从一个角度看,你的问题是“任意精度”计算的主题特别琐碎的变化。你如何想象当你需要用精确的精确度来存储,操纵和执行1024比特数字的“数学运算”时,密码处理是如何处理的?

在这种情况下的简单的策略将每个数字分离成其组成“LHSofD”(十进制的左手侧),而“RHSofD”值。例如,你可能有一个RLon(i,j)= 105.591,并希望打印105.6(或任何方式舍入)到您的NetCDF(或任何正常)文件。将此分解为RLonLHS(i,j)= 105和RLonRHS(i,j)= 591.

......此时,您可以选择增加通用性,但需要花费一定的费用。为了节省“金钱”,RHS可能保留为0.591(但是如果你需要做更有趣的事情,则可以忽略一般性)。

为简单起见,假设“廉价而愉快”的第二种策略。

LHS很简单(Int())。

现在,对于RHS,乘以10(如果您希望轮到1 DEC),例如,到达RLonRHS(i,j)= 5.91,然后将Fortran“round到最近的Int”NInt()内在......留给RLonRHS(i,j)= 6.0。

...和鲍勃是你的叔叔:

现在您打印LHS和RHS您的netCDF使用适当的写声明串接“偶”,并创建一个精确的表示按在所需的目标OP。

......当然后来读入这些值会返回到上面所述的相同问题,除非读入也是ArbPrec意识到的。

...我们写了我们自己的ArbPrec库,但也有一些关于VBA和其他HGL的......但被警告完整的ArbPrec机械位是一个不平凡的问题......幸运的是你的问题非常简单。

相关问题