[C] printf bug?? (VxWorks)

Pagina: 1
Acties:
  • 192 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Rowwan
  • Registratie: November 2000
  • Nu online
Als softwareontwikkelaar ontwikkelen we software voor de Intel I960CA processor. Hiervoor gebruiken we VxWorks (v5.1 of 5.4, ben hier niet zeker van)
Als ontwikkelomgeving hebben we Tornado 2.0

Nu heb ik het volgende probleem. Het afdrukken van bepaalde doubles/floats gaat niet goed.

code:
1
2
printf ("Value = %.2f\n", 99999998.5);  //Goed
printf ("Value = %.2f\n", 19999998.5);  //Fout : 19999990.50


Drukt af:
code:
1
2
99999998.50
19999990.50


Is er een manier om floats af te drukken zonder gebruik te maken van printf (sprintf werkt ook niet)?? Ik weet dus niet of de getallen altijd verkeerd worden geinterpreteerd, of dat alleen het afdrukken fout gaat. Hoe implementeer ik bijvoorbeeld m'n eigen printf??

Of is dit een bekende bug?

Acties:
  • 0 Henk 'm!

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
code:
1
fprintf(stdout, "...%.2f\n", getal);
:?

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Dit komt door de IEEE representatie van een float. Bij erg grote floats is de precisie minder. Je zou doubles kunnen proberen ipv floats of een ander formaat (bv een struct met 2 longs voor zowel integer part als fraction part). Veel C-runtime libraries hebben problemen met het afdrukken van floats die groot zijn.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-10 16:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

EfBe: het zijn ook doubles. Bovendien zorgt zo'n afrondingsfout niet voor 19999990.50, naar eerder voor 19999999 :)

Het is ook totaal geen afrondingsfout: hij zit er gewoon 8 naast, terwijl de decimalen achter de 8 (achter de komma dus) wel goed staan

[ Voor 37% gewijzigd door .oisyn op 20-12-2002 12:48 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
oisyn: Hmmm inderdaad, bij een float zou je een 'f' verwachten achter het getal. mijn fout. (Zelf wel problemen gehad bij floats met veel decimalen, die dus niet correct bleken te zijn wegens limiten in de IEEE representatie)

In VC++ 7 krijg ik keurig de getallen eruit die men erin stopt. Kennelijk dus een bug in de library die men gebruikt.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • Rowwan
  • Registratie: November 2000
  • Nu online
Wanneer ik het volgende draai:

code:
1
2
3
4
5
6
value = 127780000;
for (int i=0; i<20; i++)
{
       value += 8.5*i;
       printf ("Value= %f", value);
}


Ik zie dat bij elk getal het 2e decimaal voor de komma een 0 heeft. De rest van de cijfers klopt...

Het lijkt dus idd op een library probleem...

Is er een andere manier om iets af te drukken in C?? (Assembly??)

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Als je de double naar long converteert en die via printf afdrukt, mist hij dan ook de 8? indien niet, dan kun je de double middels 2 keer een conversie als 2 longs afdrukken, de een de longvalue, de andere de fraction.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 18-09 07:46
probeer het eens met %lf

Acties:
  • 0 Henk 'm!

  • Rowwan
  • Registratie: November 2000
  • Nu online
%lf werkt ook niet :(

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
werkt (uit het hoofd, kan buggen :P)
code:
1
2
3
double dFoo = 19999998.5;
long lFoo = (long)dFoo; // gives warning
printf("Value=%d.%2d",(long)dFoo, (int)((dFoo-(double)lFoo)*100.0) );

?

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • Rowwan
  • Registratie: November 2000
  • Nu online
Werkt idd... Maar lijkt me niet ideaal om alle code aan te passen... Heb al contact opgenonen met producent (WindRiver).. Maar toch bedankt allemaal
Pagina: 1