Fortran Coder

标题: 使用8位精度变量时常量的精度问题 [打印本页]

作者: zhangsw13    时间: 2019-11-19 10:52
标题: 使用8位精度变量时常量的精度问题
如果设置变量kind=selected_real_kind(8),是不是在对变量赋值以及运算过程中所有涉及的常量后面都加上 _kind 才能满足精度要求呢?这样感觉很麻烦

作者: li913    时间: 2019-11-19 13:51
两种写法:1、下划线加整型常数或常量;2、加D,如 1d0, 1.0d1, 2d3分别为双精度实数 1,10,200.

1.png (900.56 KB, 下载次数: 447)

1.png

作者: zhangsw13    时间: 2019-11-19 14:50
li913 发表于 2019-11-19 13:51
两种写法:1、下划线加整型常数或常量;2、加D,如 1d0, 1.0d1, 2d3分别为双精度实数 1,10,200. ...

除了赋值的时候需要加,运算的时候也需要吗,比如a=3*b+1需要写成a=3d0*b+1d0吗
作者: necrohan    时间: 2019-11-19 15:00
本帖最后由 necrohan 于 2019-12-12 09:35 编辑
zhangsw13 发表于 2019-11-19 14:50
除了赋值的时候需要加,运算的时候也需要吗,比如a=3*b+1需要写成a=3d0*b+1d0吗 ...
《fortran95 2003程序设计》Stephen_J_Chapman,11.1.4混合运算 中说明如下:“当在一个双精度实数和另一个实数或整数间执行算术运算时,Fortran会把其他值转换为双精度值,在双精度值间完成操作。但是,只有双精度数值和其他数值都出现在同一个操作中的时候才会做这种自动转换。”
书中还给了3个例子,
1.d0/3这种会把其中的3转为双精度计算
1.0/3+1.d0/3 其中1.0/3默认是单精度的3.333333e-1,1.d0/3是3.333333333333333E-001,所以结果是6.666666333333333E-001。

看样子除了乘除法,其他都要加d0。


作者: zhangsw13    时间: 2019-11-19 15:35
necrohan 发表于 2019-11-19 15:00
计算过程中自动转到最高精度,如果b是双精度,结果就是双精度,其他常数就不需要 ...

我试了一下结果并不是啊


作者: weixing1531    时间: 2019-11-19 17:00
0.1d0 每个中间环节都要双精度
作者: vvt    时间: 2019-11-19 18:57
本帖最后由 vvt 于 2019-11-19 18:59 编辑

一些编译器允许把默认精度改成双精度。比如 -fdefault-real-8 之类的参数
作者: zhangsw13    时间: 2019-11-20 09:20
weixing1531 发表于 2019-11-19 17:00
0.1d0 每个中间环节都要双精度

感谢,以防万一就把每个常数都加上吧
作者: zhangsw13    时间: 2019-11-20 09:22
vvt 发表于 2019-11-19 18:57
一些编译器允许把默认精度改成双精度。比如 -fdefault-real-8 之类的参数

谢谢!编译器设置这里不太懂,我还是先对常数加双精度吧
作者: necrohan    时间: 2019-11-20 20:06
zhangsw13 发表于 2019-11-19 15:35
我试了一下结果并不是啊

我记得是有这个规则,也试了确实单精度没有默认转为双精度计算,很抱歉我之前没有实践,差点耽误你。
作者: vvt    时间: 2019-11-20 21:29
zhangsw13 发表于 2019-11-20 09:22
谢谢!编译器设置这里不太懂,我还是先对常数加双精度吧

所以你一直不懂




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2