<div dir="ltr">Your problem is that while 35.7 looks nice and neat in decimal -- it's 357/10 -- computers store numbers in binary. In the case of IEEE double precision floating point it will be stored as 5024328334285210/2^47 which is 5024328334285210/140737488355328. That's the nearest you can do in binary floating point with a 53 bit mantissa.<div><br></div><div>Multiply by 100 and you get 502432833428521000/140737488355328, which if you work it out is 3570, with 40 left over. Which is not exactly 3570. But it's close.</div><div><br></div><div>If you need more accurate than that you should use fractions (in fact, "bignum" fractions), not floating point. </div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 21, 2017 at 8:10 PM, Daniil Troshkov via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi all!<br><br>There is a simple c code:<br><br>double a = 3570.0;<br>double b = 35.7 * 100;<br>int main ()<br>{<br>  if (b != a) return 1;<br>  return 0;<br>}<br><br>It returns 1 due to:<br>40abe400 00000000 //a = 3570.0<br>40abe400 00000001 //b = 35.7 * 100;<br><br>gcc do the same thing, so I think it's ok but why?<br><br>For floats:<br><br>float a = 3570.0;<br>float b = 35.7 * 100;<br>int main ()<br>{<br>  if (b != a) return 1;<br>  return 0;<br>}<br><br>It returns 0...<br>455f2000 //a = 3570.0<br>455f2000 //b = 35.7 * 100;<br><br>I will be grateful to get any explanations.<br><br><br></div>
<br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>