Kezdőlap › Fórumok › Programozás › Na ez mi ?
- This topic has 32 hozzászólás, 11 résztvevő, and was last updated 20 years, 3 months telt el by
tovis.
-
SzerzőBejegyzés
-
2005-03-30-10:46 #2010702
Kösz, de evvel szerintem még nem oldódott meg a probléma, mivel c értéke kissé eltér a normálistól ( nem merem azt írni, hogy a végeredménytõl, mert manapság az már nem tudható biztosan :-)) ).
Sajnos most én nem tudom kipróbálni az általam talált doksiban említett két módszert:
1)2005-03-30-10:47 #2010703Az én megoldásom:
Code:int main(int argc, char * argv[]) {long double a,b,c;
a=65.13;
b=21160;
c=a*b;
printf („a=%Lf, b=%Lf, c=%Lf, a*b=%Lf „,a,b,c,(a*b));
if((long double)(a*b)!=c)
printf(„nMost hibáztam!na:t%L4.4fnb:t%L4.4fnc:t%L4.4fna*b:t%L4.4dnn”,a,b,c,(a*b));
else
printf(„nMost eltaláltam!na:t%Lfnb:t%Lfnc:t%Lfnn”,a,b,c);
return 0;
}gabor@ubuntu:/mnt/uhuhomehda3/gabor $ ./teszt
a=65.130000, b=21160.000000, c=1378150.800000, a*b=1378150.800000
Most eltal2005-03-30-10:50 #2010704most akkor normális eredmény kell vagy összehasonlítás??? 🙂
(amugy ne hasonlíts össze =-vel double vagy float számokat, ahogy a man és a doksi is írja)
[align=right][snapback]126905[/snapback][/align]Akkor hogyan ?
Mivel az alapproblémám az volt, hogy az értékek egy adattáblába kerülnek, ahova be van téve egy automatikus ellenõrzés, hogy a*b egyenlõ-e c-vel.
Az összehasonlítást és az értékkezelést sem lehet kikerülni, mind a kettõre szükség van.2005-03-30-11:12 #2010705Akkor hogyan ?
Mivel az alapproblémám az volt, hogy az értékek egy adattáblába kerülnek, ahova be van téve egy automatikus ellenõrzés, hogy a*b egyenlõ-e c-vel.
Az összehasonlítást és az értékkezelést sem lehet kikerülni, mind a kettõre szükség van.
[align=right][snapback]126907[/snapback][/align]abs(a*b-amineklenniekell)<1e-4
Code:main() {long double a,b,c;
a=65.14;
b=21160.0;
c=a*b;if((a*b)!=c)
printf(„nMost hibaztam!na:t%40.30Lgnb:t%40.30Lgnc:t%40.30Lgna*b:t%40.30Lgnn”,a,b,c,(a*b));
else
printf(„nMost eltalaltam!na:t%40.30Lgnb:t%40.30Lgnc:t%40.30Lgna*b:t%40.30Lgn”,a,b,c,(a*b));
}Most eltalaltam!
a: 65.1400000000000005684341886081
b: 21160
c: 1378362.40000000001202806743095
a*b: 1378362.40000000001202806743095long nélkül pedig:
Most hibaztam!
a: 65.1400000000000005684341886081
b: 21160
c: 1378362.39999999990686774253845
a*b: 1378362.39999999990686774253845csak hogy érdekes legyen! 🙂
2005-03-30-12:52 #2010706Na pont ezt akartam épp javasolni! Mármint, hogy állítsd át a tizedes pont utáni kijelzett digitek számát, és egybõl látványosabb a dolog.
Magamnál kipróbáltam.2005-03-31-07:12 #2010707Na pont ezt akartam épp javasolni! Mármint, hogy állítsd át a tizedes pont utáni kijelzett digitek számát, és egybõl látványosabb a dolog.
Magamnál kipróbáltam.
[align=right][snapback]126924[/snapback][/align]Ez akkor OK, kösz mindenkinek.
Viszont az adattáblával még mindig harcolok, nem akar összejönni két float típus ( adatbázis float ) szorzatának értékelése. Esetleg ha van valaki aki ebbe bele tud szólni ? Jelenleg talán a float(4) valamilyen megoldást ad, de igazán nem tudom ez meddig „tart”.2005-03-31-07:51 #2010708Ha valakit érdekel: mellékelem a fentiekben említett doksi szerzõjének levelét ( írtam neki ):
„…
Yes, your program illustrates the same issue that was discussed in linux_numerics.txt on the web site. The program runs correctly under FreeBSD and 64-bit linux (Red Hat Enterprise 3 AMD64 version), but gives the wrong result when compiled for 32 bits under Red Hat Enterprise and almost certainly all other 32-bit Linux distributions.Here’s a version that runs correctly in 32-bits:
#ifdef __linux
#include
#endifint main(int argc, char * argv[]) {
double a,b,c;
#ifdef __linux
// This puts the X86 FPU in 64-bit precision mode. The default under
// Linux is to use 80-bit mode, which produces subtle differences from
// FreeBSD and other systems, eg, (int)(1000*atof(„0.3”)) is 300 in
// 64-bit mode, 299 in 80-bit mode.
fpu_control_t cw;
_FPU_GETCW(cw);
cw &= ~_FPU_EXTENDED;
cw |= _FPU_DOUBLE;
_FPU_SETCW(cw);
#endifa=65.13;
b=21160;
c=a*b;
printf („a=%lf, b=%lf, c=%lf, a*b=%lf „,a,b,c,(a*b));
if((a*b)!=c)
printf(„nWrong result!na:t%14.4fnb:t%14.4fnc:t%14.4fna*b:t%14.4fnn”,a
,b,c,(a*b));else
printf(„nGood result!na:t%1fnb:t%1fnc:t%1fnn”,a,b,c);
return 0;
}
Regards,Steve Whiteley
…”
2005-04-01-12:20 #2010709próbáld ki azt:
double helyett unsigned double
nekem ugy sikerult2005-04-02-07:20 #2010710uzsolt: erre tudnál példát hozni? Elég meredeken hangzik, hogy a szorzás nem mindig
kommutatív :ph34r:
[align=right][snapback]126888[/snapback][/align]Lehet, hogy speciel szorzásra nem tudok, de próbáld ki a következõt egy számológéppel:
10^20+3-10^20-2
és persze permutáld (változtasd) a sorrendet. Szinte minden változatra más-más eredmény fog kijönni. Lehet, hogy szorzásra is lehet valami hasonlót kreálni. Ja, szerintem számítógéppel se „kommutatív” az összeadás (már persze nem maple, maxima meg egyéb computer-algebrai progival).Az eredeti problémához: úgy látom, lassan megoldódik. Egyébként javaslom, hogy sok (kb. 10) tizedesjegy pontossággal legyenek kiírva a számok, nagy meglepetések érhetik az embert 🙂
2005-04-05-17:13 #2010711Az en probalkozasom Slackware 10 alatt:
Code:#includeint main(int argc, char * argv[])
{
double a,b,c;
a=65,14;
b=21160;
c=a*b;if (c!=a*b)
{
printf(„nMost hibáztam!na:t%14.4fnb:t%14.4fnc:t%14.4fna*b:t%14.4fnn”,a,b,c,(a*b));
}
else
{
printf(„nMost eltaláltam!na:t%14.4fnb:t%14.4fnc:t%14.4fna*b:t%14.4fnn”,a,b,c,(a*b));
}
return(0);
}utf kodolasra van allitva a rendszerem. Nem tudom, hogy ezert vagy masert de nalam egy tizedes pont helyett egy vesszo megoldotta.
gcc version 3.3.4 -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz