을 절단 할 때 소수점 반올림 부동 : 나는 [min, max]의 범위에서 임의의 부동 소수점 값을 생성하는 함수를 작성하는 것을 시도하고있다이 아마 86 FPU 전문가에 대한 질문입니다
. 문제는 제 생성기 알고리즘 (부동 소수점 Mersenne Twister, 호기심이 있다면) 만 범위 [1,2]의 값을 반환한다는 것입니다. 즉, 상한선을 포함하지만 내 "소스"생성 값은 배타적 인 상한으로부터 여기서 catch는 기본 생성자가 8 바이트 double을 반환하지만 4 바이트 float 만 필요하며 가장 가까운 FPU 반올림 모드를 사용하고 있습니다.
내가 알고 싶은 것은이 경우 자르기 자체가 FPU 내부 80 비트 값이 충분히 가까운 경우 반환 값이 최대 값을 포함하는지 여부 또는 최대 값의 significand를 증가시켜야하는지 여부입니다. [1,2]에서 중개 무작위로 곱하기 전에, 또는 FPU 모드를 변경해야하는지). 물론 다른 아이디어도 있습니다.
는 여기에 내가 현재 사용하고있는 코드, 그리고 그 1.0F는 0x3f800000로 확인 확인 않았다
float MersenneFloat(float min, float max)
{
//genrand returns a double in [1,2)
const float random = (float)genrand_close1_open2();
//return in desired range
return min + (random - 1.0f) * (max - min);
}
이 차이를 만드는 경우,이 Win32에서 MSVC++ 및 Linux GCC 모두에서 작동합니다. 또한 SSE 최적화의 모든 버전을 사용하면 이에 대한 대답이 변경됩니까?
편집 : 대답은 예입니다.이 경우에는 double에서 float로 잘라내어 결과가 최대 값을 포함하기에 충분합니다. 자세한 내용은 Crashworks의 답변을 참조하십시오.
지금 내가 왜 다른 사람 사이에서 테스트를 실행하지 않았는지 :) 잘라내기를 사용하면 1.99999가/arch : SSE2가있는 경우와없는 경우 모두 2로 반올림된다는 것을 발견했습니다. 감사! –
도와 줘서 기쁩니다 - 테스트의 결과가 나 자신인지 궁금했습니다. – Crashworks