이 코드를 살펴보십시오. 10/3 return 3.333333 604736328125000 그리고 제가 계산기로 3을 곱하면 저는 9.99가됩니다. 그러나 코드로 똑같이하면 정확히 10.00이됩니다. 어떨까요?왜 C에서 10/3인지 정확히 알겠습니까?
0000000000400497 <main>:
400497: 55 push rbp
400498: 48 89 e5 mov rbp,rsp
40049b: f3 0f 10 05 b1 00 00 movss xmm0,DWORD PTR [rip+0xb1] # 400554 <_IO_stdin_used+0x4>
4004a2: 00
4004a3: f3 0f 11 45 fc movss DWORD PTR [rbp-0x4],xmm0
4004a8: f3 0f 10 4d fc movss xmm1,DWORD PTR [rbp-0x4]
4004ad: f3 0f 10 05 a3 00 00 movss xmm0,DWORD PTR [rip+0xa3] # 400558 <_IO_stdin_used+0x8>
4004b4: 00
4004b5: f3 0f 59 c1 mulss xmm0,xmm1
4004b9: f3 0f 11 45 f8 movss DWORD PTR [rbp-0x8],xmm0
4004be: b8 00 00 00 00 mov eax,0x0
4004c3: 5d pop rbp
4004c4: c3 ret
4004c5: 66 2e 0f 1f 84 00 00 nop WORD PTR cs:[rax+rax*1+0x0]
4004cc: 00 00 00
4004cf: 90 nop
내가 mulss가 CPU 기능에 의해 반올림 생각 :
#include <stdlib.h>
#include <stdio.h>
int main() {
float v = 10.f/3.f;
float test = v*3.f;
printf("10/3 => %25.25f \n (10/3)*3 => %25.25f\n",v,test);
return 0;
}
이 기본 GCC에게 7.2.1 매개 변수를 사용하여 컴파일의 printf없이 어셈블리 코드이다. BC는 GNU 프로그램 참고
, 10/3은 3.3333333333333333333333는 (* 3 => 9.9999) 및 SciLab으로는 4813 631 3.333333333333333 (* 3 => 10)을 리턴.
설명은 확장 토론이 아닙니다. 이 대화는 [채팅으로 이동되었습니다] (http://chat.stackoverflow.com/rooms/160240/discussion-on-question-by-amanda-osvaldo-why-10-3-its-exact-in-c) . – Andy
'mulss' 결과는 가장 가까운 것으로 반올림되는 기본 IEEE754 반올림 모드를 사용하여 반올림됩니다. (프로그램은'#pragma FENV_ACCESS ON'을 사용하지 않고 FP 반올림 모드를 다른 것으로 설정하기 때문에 컴파일러는 기본 반올림 모드를 사용하는 프로그램을 생성합니다.) –