Gjate programimit ne C te nje algoritmi gjenetik per nje probleme optimizimi lineare, hasja probleme me operacionet aritmetike te numrave dhjetore, te tipit double (ose float). Teksa nga ana teorike gjithcka prisja te dilte sipas projektimit, ne anen praktike (dhe kjo eshte normale deri diku), hasja probleme teknike, lidhur me specifikimet teknike te ANSI C, sipas IEEE. Kur te gjithe kodin ne C e perktheva ne VB.NET, nuk hasa me asnje problem (madje, edhe shpejtesia e ekzekutimit u rrit - gje qe eshte e pritshme ne programimin e orientuar me objekte). Per te mos humbur thelbin e kesaj teme, vendosa te kerkoj ne internet dhe hasa ne faqen e meposhtme, tek kodet e se ciles dua te ndalem pak: http://www.macaulay.ac.uk/fearlus/fl...int/index.html.
Ne faqe, tipi double percaktohet thjesht dhe bukur si me poshte:
[ident]Aritmetika me numrat dhjetore eshte nje menyre standarde e te punuarit me numra jo te plote ne nje mashine dixhitale. Tipi eshte projektuar per te ngjallur iluzionin se po punohet me numra dhjetore, teksa ne fakt nje mashine punon rigorozisht me nje bashkesi te fundme numrash (teksa dihet qe numrat dhjetore jane te pafundem).[/ident]
Ne gjuhen C/C++, per te punuar me ndryshore te tipit reale, duhet t'i deklarojme si double (ose float, por double ka me shume saktesi). Marrim shembullin qe eshte dhene ne faqen, url-ne e se ciles kam paraqitur me lart:
Variabli ENERGY deklarohet si double dhe i jepet nje vlere fillestare prej 1.2. Paskesaj, hiqet 3 here vlera 0.4. Matematikisht, rezultati ne fund duhet te jete zero. Megjithate, nje ekzekutim i thjeshte i kodit te mesiperm nxjerr kete rezultat:Kodi:double ENERGY = 1.2; ENERGY = ENERGY - 0.4; ENERGY = ENERGY - 0.4; ENERGY = ENERGY - 0.4;
Kjo mungese saktesie e specifikimit te tipit double sjell gabime ne rrumbullakosje dhe perafrime te tjera, te cilat nga kendveshtrimi natyror (ose aritmetik) jane te sakta, ndersa nga kendveshtrimi i mashines (teknik) jane te ndryshme. Teksa per ne (sipas matematikes) vlera -0.0 eshte e njejte me vlere 0, per mashinen keto dy vlera jane te ndryshme. Shpjegimi, sipas faqes, qendron tek bijeksioni midis bashkesise se numrave reale dhe struktures teknike (te mashines) te percaktuar nga IEEE.Kodi:-0.000000
Per shembull, nese me lart do te krahasonim vleren e variablit ENERGY me vleren ZERO, rezultati nuk do te ishte i njejte:
Ne kete rast, vlera e ENERGY eshte -0.0, dhe, sipas mashines, kjo vlere eshte me e vogel se vlera zero. Ne fakt, aritmetikisht keto jane te barabarta. Por, nese perdorim funksionin fabs() per te marre vleren absolute te ENERGY, atehere rezultati del zero, e serish nuk njihet i njejte me vleren ZERO nga mashina. Dhe, nese perserisim edhe njehere krahasimin e mesiperm, vlera e ENERGY (qe tani eshte 0.00000) del me e madhe se vlera e ZERO, qe eshte deklaruar qe ne fillim si 0.0.Kodi:double ZERO = 0.0; ENERGY = 1.2; ENERGY = ENERGY - 0.4; ENERGY = ENERGY - 0.4; ENERGY = ENERGY - 0.4; if (ENERGY==ZERO) puts("ENERGY = ZERO"); else puts("ENERGY <> ZERO");
Ky eshte nje problem qe mund te shkaktoje konfuzion tek programuesi dhe duhet te kene kujdes ata qe programojne ne C.
Nder probleme te tjera qe paraqiten ne faqe, eshte edhe vecoria e shoqerimit aritmetik, e cila duket sikur funksionon per nje set, por jo per nje tjeter. Per shembull, nese krahasohet vlera 0.1+0.2+0.3 me vleren 0.6, rezultati eshte i njejte vetem ne rastin kur kllapat vendosen si me poshte:
[code]
if (0.1 + (0.2 + 0.3)) == 0.6); // rezultati del ekuivalent
[code]
Ne raste te tjera, si psh. if (0.1 +0.2 + 0.3 == 0.6); if nuk ekzekutohet sepse mashina, per shkak te mungeses se saktesise (precisionit) si pasoje e paraqitjes teknike te numrave dhjetore, nuk arrin t'i "shohe" si te njejte shumen e 0.1 +0.2 +0.3 dhe vleren 0.6.
Kjo therret per nje kujdes te larte gjate programimit. Ne algoritmin gjenetik qe permenda me lart, u detyrova te marr nje variabel (RESULT) dhe te mbledh dy nga dy te gjithe operandet qe ishin me shume se dy. Ne kete menyre, mbahet ekuivalenca logjike (aritmetike) dhe "genjehet" edhe mashina. Me poshte do te paraqes testet perkatese ne .NET.
Krijoni Kontakt