티스토리 뷰
반올림 오류의 원인을 알 수 없기 때문에 약간 까다 롭습니다. 경우 dx
보다는 다만 작은 조금 더 컸다 0.008
다음 부문은 before/dx
여전히 같은 값으로 반올림 될 수 있지만, 지금 -13
올바른 해답이 될 것입니다.
그게 내가 본 것을 것을 주변의 가장 일반적인 방법 그냥하는 것입니다 말했다 찔러 반대 방향으로 아무리 작은 이전 값을. 이 같은:
program sign_test
use iso_fortran_env
implicit none
real(kind=real64) :: a, b
integer(kind=int32) :: c
a = -0.112
b = 0.008
c = my_ceiling(a/b)
print*, a, b, c
contains
function my_ceiling(v)
implicit none
real(kind=real64), intent(in) :: v
integer(kind=int32) :: my_ceiling
my_ceiling = ceiling(v - 1d-6, kind=int32)
end function my_ceiling
end program sign_test
이것은 대부분의 값에 영향을 미치지 않지만 이제 의도 한 것보다 더 많이 반올림되는 몇 가지 값이 있습니다.
-------------------실수가 지정된 정밀도에 대해 개념적으로 "정확한"경우 다음과 같이 할 수 있습니다.
after=nint(1000*before)/nint(1000*dx)
이것은 당신의 예를 위해 작동합니다. 당신은 양수 값에 대해 기대하는 것을 말하지 않았으므로 약간 작업해야 할 수도 있습니다.
출처
https://stackoverflow.com/questions/39970023
댓글