나는 내 컴퓨터에서 그것을 시도했다. 그리고 세 가지 접근 방법 :
1. 1 추가하고
가 같은 대답을 줄 것으로 보인다 (1.0F + FLT_EPSILON)에 의해 FLT_EPSILON에게
3. 곱셈을 추가
2. memcopying.
여기에 결과를 볼
의 bash-3.2 $ CC float_test.c -o float_test; ./float_test 1.023456 10
원래 NUM : 1.023456
INT는 = 추가 1.023456 01-EPS 첨가 = 1.023456 MULT 01 * (EPS + 1) = 의해 1.023456
INT는 = 추가 1.023456 02 EPS 첨가 = 1.023456 MULT 02로 * (eps + 1) = 1.023456
int = 1.023456 03-eps added = 1.023456x03 * (eps + 1) = 1.023456
int added = 1.023456 04-eps added = 1.023456x4 by (eps + 1)) = 1.023456
INT 첨가 = 1.023457 05 EPS 05 * (EPS + 1) = 의해 = 1.023457 MULT 추가 1.023457
INT는 = 추가 1.023457 06-EPS 첨가 = 1.023457 MULT 06 * (EPS + 1) = 1.023457
하여 (eps + 1) = 1.023457 012-009457x = 1.023457
int added = 1.023457 08-eps added = 1.023457 mult by 08 * (eps + 1) = 1.023457
int added = 1.023457 09-EPS 09 * (EPS + 1) = 의해 = 1.023457 MULT 추가 1.023457
INT는 = 추가 1.023457 10 EPS 첨가 = 1.023457 MULT 10 * (EPS + 1) = 1.023457
코드
하여
#include <float.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main(int argc, char *argv[])
{
if(argc != 3) {
printf("Usage: <binary> <floating_pt_num> <num_iter>\n");
exit(0);
}
float f = atof(argv[1]);
int count = atoi(argv[2]);
assert(count > 0);
int i;
int num;
float num_float;
printf("Original num: %f\n", f);
for(i=1; i<=count; i++) {
memcpy(&num, &f, 4);
num += i;
memcpy(&num_float, &num, 4);
printf("int added = %f \t%02d-eps added = %f \tmult by %2d*(eps+1) = %f\n", num_float, i, f + i*FLT_EPSILON, i, f*(1.0f + i*FLT_EPSILON));
}
return 0;
}
정말 궁금한 답변입니다. – Almo
'memcpy'를 정수로 변환하고,'memcpy'를'float'에 다시 넣으시겠습니까? –
@BartFriederichs : 아니요, 모든 경우에 작동하지 않습니다. –