在fortran中,我必须将经纬度舍入小数点后的一位数字。Fortran - 要舍入到小数点一位
我使用gfortran编译器和NINT功能,但下面不工作 -
rlons(i,j) = nint(rla2rlarot*10.0)/10.0
在fortran中,我必须将经纬度舍入小数点后的一位数字。Fortran - 要舍入到小数点一位
我使用gfortran编译器和NINT功能,但下面不工作 -
rlons(i,j) = nint(rla2rlarot*10.0)/10.0
有没有办法做到你的要求。根本问题是您所需的舍入值不一定能够用浮点表示。
例如,如果有一个值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文件。
是的,它可以做!上面的“接受”答案在其有限的范围内是正确的,但是在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机械位是一个不平凡的问题......幸运的是你的问题非常简单。
真正简短的答案是,你不能这样做。浮点表示是不精确的,并且不能保证浮点除以十(或四舍五入为十进制)可以精确地表示您正在使用的任何大小的浮点类型。这仅用于打印或显示? – talonmies
@talonmies - 不,它不打印或显示。我有一个输入netcdf文件,只有一位数字后小数点。我修改了经度,我想把它写回netcdf文件。 – gansub
那么,你不能用浮点来做到这一点。您需要使用固定点或小数类型代替 – talonmies