천장

2014-12-24 7 views
4

에 문제를 부동 소수점 부정확성을 수정?천장

x <- 31/60 
... 
y <- ceiling(x*60) 

나는 새로운 기능하고 생각 해요 : 분할이 옵션을 선택하지 않습니다 전에 곱셈을하는

, 내 코드는 다음과 같이 보입니다

ceil <- function(x) { 
    ceiling(signif(x)) 
} 

을하지만 난 R을 처음 접했을 때, 아마도 더 좋은 방법이있을 것입니다.

UPDATE, 나는 더 자세한 정보를 제공하지 않았다, 나는
죄송 다른 이유로 내 코드의 다른 부분에서 같은 문제가 있지만, 항상 천장
.

부동 소수점 계산에서 반올림 오류가 있음을 알고 있습니다. 어쩌면 질문의 제목이 향상 될 수 있습니다. 천장 기능의 부정확성을 수정하고 싶지 않습니다., 제가하고 싶은 것은 아마 그 반대이며 천장이 덜 정확합니다. 분명히, 노이즈 자리를 무시하는 데 필요한 엡실론 문제의 상황에 따라,

options(digits=17) 
31/60*60 
#31.000000000000004 

그러나 : 방법이 명확하게 소음이있는 자리를 무시 R 말할 수 있습니다.

+1

[부동 소수점 수학이 깨졌습니까?] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

+6

천장이 정확하므로 부정확하지 않습니다. 고치다. 반면에'/'와'*'는 모든 입력에 대해 정확하지 않으며, 부동 소수점 연산의 본질적인 특성이기 때문에이를 사용하지 않아도됩니다. –

+3

왜 이것이 downvoted인지 모르겠다. OP는 왜 이런 일이 일어나는 지 물어 보지 않고 그것을 다루는 방법을 묻습니다. vvery 합리적인 질문, 잘 제기. – jlhoward

답변

1

여기 실제 문제는 내 영웅 The Data Munger Guru의 태그 라인에서 발견됩니다. "해결하려는 문제는 무엇입니까? 어떻게 하시겠습니까? 당신은 그것을하고 싶습니다. "

부동 소수점 정밀도가 명백한 정수가"정수 +/- 엡실론 "으로 바뀌는 무수한 경우가 있습니다. 그래서"천정 "으로 갈 이유를 알아야합니다. 왜 정수가 아닌 값을 허용 할 수 있습니까? < - Pascal Cuoq이 자신의 의견에 쓴 내용이 다소 차이가 있습니다.

따라서 귀하의 우려에 대한 해결책은 실제로 진행되고있는 것에 달려 있습니다. 아마도 trunc(x/60)->y 다음에 trunc(y*60)이 뒤따를 수도 있고 그렇지 않을 수도 있습니다 .-). 어쩌면 y<-round(x/60*60) +1, 또는 jhoward의 제안 된 접근 방식을 원할 수도 있습니다. 그것은 내가 강조하는 것처럼 당신의 목표가 무엇인지, 그리고 코너 사건을 어떻게 다루고 싶은지에 달려 있습니다.

+0

천장 싶어요. 나는 천장 (30.9) == 31, 천정 (31) == 31, 천장 (31.1) == 32를 원한다. – pomber

+0

당신은 내 대답의 요점을 놓치고있다. "천장"을 원하지만, 왜 그리고 어떤 목적으로 ? –