나중에 형식을 지정하려면 밑이 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비트 가수를 사용하여 범위를 확장하려고 시도하지 마십시오. 경우에 따라 실패할 수 있습니다).