You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran双精度三角函数cos(pi/2)精度不足如何优化

问题核心原因

你遇到的精度问题根源是浮点数字面量未指定精度类型,导致计算过程隐式降级为单精度。

你输出的pi = 3.1415927410125732本身就存在约1e-7的误差:标准双精度π的准确值约为3.141592653589793,误差量级已经和你得到的cos结果匹配,问题出在pi的计算环节而非cos函数本身。

Fortran的浮点数字面量默认使用单精度类型,和赋值目标的变量类型无关。你代码中4.0、1.0、2.0都是单精度字面量:

  • atan(1.0)会先返回单精度的atan结果,乘以单精度的4.0得到单精度的π值,再赋值给双精度的pi变量时,仅做类型转换不会恢复已经损失的精度
  • 后续pi/2.0计算中,单精度的2.0会把双精度的pi拉到单精度再计算,进一步引入精度损失

优化方案

  • 所有浮点字面量追加你定义的_dp后缀,强制全程用双精度计算:
    把pi的定义改为Real(dp), parameter:: pi = 4.0_dp * atan(1.0_dp)
    把cos计算改为angle = cos(pi / 2.0_dp)
  • 可选兼容性优化:Fortran 2008及以上标准可通过内置模块统一定义精度,替换原有的dp定义,语法更规范:
    开头添加use, intrinsic :: iso_fortran_env, only: dp => real64
  • 若需要更高精度,可直接定义四精度类型:integer, parameter :: qp = selected_real_kind(30, 1000),所有字面量改为_qp后缀,可获得远高于double的计算精度(需编译器支持四精度运算)

修改后完整代码

program precision_Fortran
  IMPLICIT  NONE
  ! 若使用Fortran 2008标准可替换为下面一行定义dp
  ! use, intrinsic :: iso_fortran_env, only: dp => real64
  integer, parameter :: dp = selected_real_kind(15, 307)
  
  Real(dp), parameter:: pi=4.0_dp*atan(1.0_dp)
  Real(dp) :: angle

  angle = cos(pi/2.0_dp)
  
  write(*,*)'pi = ', pi
  write(*,*)'angle = ', angle
     
end program precision_Fortran

验证效果

修改后编译运行,输出的pi将为标准双精度值3.141592653589793,angle的误差会降到1e-16 ~ 1e-17量级,和你用C++ double得到的结果一致。

注意:该特性是Fortran和C/C的核心差异之一:C/C中1.0默认是double类型,但Fortran的字面量精度仅由自身后缀决定,和赋值目标无关,所有浮点数计算场景都要注意给字面量追加对应kind后缀,避免隐式精度降级。

内容的提问来源于stack exchange,提问作者ZeroTwo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:48:03