bug-gnu-utils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: int-function: programming error or bug?


From: Manuel Collado
Subject: Re: int-function: programming error or bug?
Date: Sat, 28 Feb 2009 01:01:53 +0100
User-agent: Thunderbird 2.0.0.19 (Windows/20081209)

Aron Brunner escribió:
Dear Sir, dear Madame,

thank you very much for awk/gawk i work with over the last 10 years
with success and great joy.
With gawk 3.1.6 on Mandriva 2009.0 i get a result i don't understand:

The code
-----------------------------------------------
#!/usr/bin/awk -f

BEGIN {
  for (alfa=8.6;alfa<=9.2;alfa=alfa+0.1) {
    alfaint=int(alfa);
    printf "%s%5.10f s%d\n","alfa=",alfa,"int(alfa)=",alfaint;

'%' missing in format. Should be.
     printf "%s%5.10f %s%d\n","alfa=",alfa,"int(alfa)=",alfaint;

  }
  beta=9.0;
  betaint=int(beta);
  printf "%s%5.10f %s%d\n","beta=",beta,"int(beta)=",betaint;
}
-----------------------------------------------
gives the integer from alfa=9.0 to 8:
alfa=8.6000000000 int(alfa)=8
alfa=8.7000000000 int(alfa)=8
alfa=8.8000000000 int(alfa)=8
alfa=8.9000000000 int(alfa)=8
alfa=9.0000000000 int(alfa)=8
alfa=9.1000000000 int(alfa)=9
alfa=9.2000000000 int(alfa)=9
beta=9.0000000000 int(beta)=9

I suppose i wrote the code-lines in a wrong manner;
may i respectfully ask for information.

Most decimal floating point values don't have an exact internal binary representation. A slight change in your code shows it clearly:
---------------------
BEGIN {
  for (alfa=8.6;alfa<=9.2;alfa=alfa+0.1) {
    alfaint=int(alfa);
    printf "%s%5.20f %s%d\n","alfa=",alfa,"int(alfa)=",alfaint;
  }
  beta=9.0;
  betaint=int(beta);
  printf "%s%5.20f %s%d\n","beta=",beta,"int(beta)=",betaint;
}
----------------------
alfa=8.59999999999999964473 int(alfa)=8
alfa=8.69999999999999928946 int(alfa)=8
alfa=8.79999999999999893419 int(alfa)=8
alfa=8.89999999999999857891 int(alfa)=8
alfa=8.99999999999999822364 int(alfa)=8
alfa=9.09999999999999786837 int(alfa)=9
alfa=9.19999999999999751310 int(alfa)=9
beta=9.00000000000000000000 int(beta)=9

Nothing wrong with int(), as you can see.

Hint: use integral values in the for loop control:

  for (alfa10=86; alfa10<=92; alfa10++) {
    alfa = alfa10 / 10.0
    ...
  }

--
Manuel Collado - http://lml.ls.fi.upm.es/~mcollado


reply via email to

[Prev in Thread] Current Thread [Next in Thread]