请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
我正在尝试学习Fortran,我看到很多不同的定义被传递,我想知道他们是否想要完成同样的事情.以下有什么区别?
integer*4 integer(4) integer(kind=4)在Fortran 90中(在Mac OS X上使用gfortran)如果我将一个值赋值给一个双精度变量而没有明确地添加一种类型,则精度不会"采用".我的意思是,如果我运行以下程序:
program sample_dp
implicit none
integer, parameter :: sp = kind(1.0)
integer, parameter :: dp = kind(1.0d0)
real(sp) :: a = 0.
real(dp) :: b = 0., c = 0., d = 0.0_dp, e = 0_dp
! assign values
a = 0.12345678901234567890
b = 0.12345678901234567890
c = DBLE(0.12345678901234567890)
d = 0.12345678901234567890_dp
write(*,101) a, b, c, d
101 format(1x, 'Single precision: ', T27, F17.15, / &
1x, 'Double precisison: ', T27, F17.15, / &
1x, 'Double precision (DBLE): …Run Code Online (Sandbox Code Playgroud) 是否可以精确地获得超过16位数double而不使用quadruple?如果可能,它是否依赖于编译器或其他东西?因为我知道有人说他正在double精确地工作并且具有22位精度.
当我用Fortran语言编写代码时,我发现当我在do-loop中将REAL值设置为control-var时,输出很奇怪,例如:
do i=0.1,1.0,0.1
write (13,"(F15.6)") i
end do
Run Code Online (Sandbox Code Playgroud)
输出是:0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0.但是当我将起始值设置为0.6时:
do i=0.6,1.0,0.1
write (13,"(F15.6)") i
end do
Run Code Online (Sandbox Code Playgroud)
输出是:0.6,0.7,0.8,0.9,而1.0不是输出.为什么会这样?