log()와 함께 int()를 사용하는 awk 반올림 오류

log()와 함께 int()를 사용하는 awk 반올림 오류

나중에 형식을 지정하려면 밑이 10인 로그를 계산해야 합니다. 여태까지는 그런대로 잘됐다:

$ awk 'BEGIN { print log(1000) / log(10) }'
3
$ awk 'BEGIN { print log(1001) / log(10) }'
3.00043

소수점 이하 자릿수를 제거해야 하므로 다음을 사용합니다 int().

$ awk 'BEGIN { print int(log(1001) / log(10)) }'
3

여태까지는 그런대로 잘됐다. 그런데 이게 뭐죠(!):

$ awk 'BEGIN { print int(log(1000) / log(10)) }'
2

누구든지 이 반올림 오류나 이것이 무엇인지 설명할 수 있습니까?

문제를 해결하는 올바른 방법은 무엇입니까?

미리 감사드립니다!

답변1

반올림은 결코 쉬운 일이 아니며, 그럴 수도 없습니다.정밀한그러나 최대 15자리(53자리 가수의 경우)에서는 올바른 숫자를 향해 근사(반올림)가 발생해야 합니다.

$ printf '%s\n' 999 1000 1001 | awk '{ v=log($1) / log(10); printf("%.15g\n",v) }'
2.99956548822598
3
3.00043407747932

따라서 가장 가까운 정수로 반올림하면(0으로 반올림하고 음수도 수정됨) %i필요한 정수를 얻을 수 있습니다.

$ printf '%s\n' 999 1000 1001 | 
    awk '{ 
           v=log($1) / log(10); 
           result=sprintf("%.15g",v); 
           printf("%-15s %i\n",v, result)
         }
        '
2.99957         2
3               3
3.00043         3

이는 최대 14자리까지 올바르게 작동해야 합니다(awk의 기본 53비트 가수를 사용하여 범위를 확장하려고 시도하지 마십시오. 경우에 따라 실패할 수 있습니다).

관련 정보