hedgewars/uFloat.pas
changeset 8838 aa2ffd427f6a
parent 7715 8b653edac2a2
child 8847 ff7fbab7cd56
child 8905 82b1400f4a08
equal deleted inserted replaced
8835:01bcf9ea68c1 8838:aa2ffd427f6a
    61 function hwFloat2Float (const i: hwFloat) : extended; inline;
    61 function hwFloat2Float (const i: hwFloat) : extended; inline;
    62 
    62 
    63 // The implemented operators
    63 // The implemented operators
    64 
    64 
    65 operator = (const z1, z2: hwFloat) z : boolean; inline;
    65 operator = (const z1, z2: hwFloat) z : boolean; inline;
    66 {$IFDEF PAS2C}
    66 
    67 operator <> (const z1, z2: hwFloat) z : boolean; inline;
       
    68 {$ENDIF}
       
    69 operator + (const z1, z2: hwFloat) z : hwFloat; inline;
    67 operator + (const z1, z2: hwFloat) z : hwFloat; inline;
    70 operator - (const z1, z2: hwFloat) z : hwFloat; inline;
    68 operator - (const z1, z2: hwFloat) z : hwFloat; inline;
    71 operator - (const z1: hwFloat) z : hwFloat; inline;
    69 operator - (const z1: hwFloat) z : hwFloat; inline;
    72 
    70 
    73 operator * (const z1, z2: hwFloat) z : hwFloat; inline;
    71 operator * (const z1, z2: hwFloat) z : hwFloat; inline;
   219 hwFloat2Float:= i.Frac / $100000000 + i.Round;
   217 hwFloat2Float:= i.Frac / $100000000 + i.Round;
   220 if i.isNegative then
   218 if i.isNegative then
   221     hwFloat2Float:= -hwFloat2Float;
   219     hwFloat2Float:= -hwFloat2Float;
   222 end;
   220 end;
   223 
   221 
   224 {$IFNDEF WEB}
       
   225 operator = (const z1, z2: hwFloat) z : boolean; inline;
   222 operator = (const z1, z2: hwFloat) z : boolean; inline;
   226 begin
   223 begin
   227     z:= (z1.isNegative = z2.isNegative) and (z1.QWordValue = z2.QWordValue);
   224     z:= (z1.isNegative = z2.isNegative) and (z1.QWordValue = z2.QWordValue);
   228 end;
   225 end;
   229 
       
   230 {$IFDEF PAS2C}
       
   231 operator <> (const z1, z2: hwFloat) z : boolean; inline;
       
   232 begin
       
   233     z:= (z1.isNegative <> z2.isNegative) or (z1.QWordValue <> z2.QWordValue);
       
   234 end;
       
   235 {$ENDIF}
       
   236 
   226 
   237 operator + (const z1, z2: hwFloat) z : hwFloat; inline;
   227 operator + (const z1, z2: hwFloat) z : hwFloat; inline;
   238 begin
   228 begin
   239 if z1.isNegative = z2.isNegative then
   229 if z1.isNegative = z2.isNegative then
   240     begin
   230     begin
   298     if z1.QWordValue = z2.QWordValue then
   288     if z1.QWordValue = z2.QWordValue then
   299         b:= false
   289         b:= false
   300     else
   290     else
   301         b:= (z1.QWordValue > z2.QWordValue) <> z2.isNegative
   291         b:= (z1.QWordValue > z2.QWordValue) <> z2.isNegative
   302 end;
   292 end;
   303 {$ENDIF}
       
   304 {$IFDEF WEB}
       
   305 (*
       
   306     Mostly to be kind to JS as of 2012-08-27 where there is no int64/uint64.  This may change though.
       
   307 *)
       
   308 operator = (const z1, z2: hwFloat) z : boolean; inline;
       
   309 begin
       
   310     z:= (z1.isNegative = z2.isNegative) and (z1.Frac = z2.Frac) and (z1.Round = z2.Round);
       
   311 end;
       
   312 
       
   313 operator <> (const z1, z2: hwFloat) z : boolean; inline;
       
   314 begin
       
   315     z:= (z1.isNegative <> z2.isNegative) or (z1.Frac <> z2.Frac) or (z1.Round <> z2.Round);
       
   316 end;
       
   317 
       
   318 operator + (const z1, z2: hwFloat) z : hwFloat; inline;
       
   319 begin
       
   320 if z1.isNegative = z2.isNegative then
       
   321     begin
       
   322     z:= z1;
       
   323     z.Frac:= z.Frac + z2.Frac;
       
   324     z.Round:= z.Round + z2.Round;
       
   325     if z.Frac<z1.Frac then inc(z.Round)
       
   326     end
       
   327 else
       
   328     if (z1.Round > z2.Round) or ((z1.Round = z2.Round) and (z1.Frac > z2.Frac)) then
       
   329         begin
       
   330         z.isNegative:= z1.isNegative;
       
   331         z.Round:= z1.Round - z2.Round;
       
   332         z.Frac:= z1.Frac - z2.Frac;
       
   333         if z2.Frac > z1.Frac then dec(z.Round)
       
   334         end
       
   335     else
       
   336         begin
       
   337         z.isNegative:= z2.isNegative;
       
   338         z.Round:= z2.Round - z1.Round;
       
   339         z.Frac:= z2.Frac-z1.Frac;
       
   340         if z2.Frac < z1.Frac then dec(z.Round)
       
   341         end
       
   342 end;
       
   343 
       
   344 operator - (const z1, z2: hwFloat) z : hwFloat; inline;
       
   345 begin
       
   346 if z1.isNegative = z2.isNegative then
       
   347     if (z1.Round > z2.Round) or ((z1.Round = z2.Round) and (z1.Frac > z2.Frac)) then
       
   348         begin
       
   349         z.isNegative:= z1.isNegative;
       
   350         z.Round:= z1.Round - z2.Round;
       
   351         z.Frac:= z1.Frac-z2.Frac;
       
   352         if z2.Frac > z1.Frac then dec(z.Round)
       
   353         end
       
   354     else
       
   355         begin
       
   356         z.isNegative:= not z2.isNegative;
       
   357         z.Round:= z2.Round - z1.Round;
       
   358         z.Frac:= z2.Frac-z1.Frac;
       
   359         if z2.Frac < z1.Frac then dec(z.Round)
       
   360         end
       
   361 else
       
   362     begin
       
   363     z:= z1;
       
   364     z.Frac:= z.Frac + z2.Frac;
       
   365     z.Round:= z.Round + z2.Round;
       
   366     if z.Frac<z1.Frac then inc(z.Round)
       
   367     end
       
   368 end;
       
   369 
       
   370 operator < (const z1, z2: hwFloat) b : boolean; inline;
       
   371 begin
       
   372 if z1.isNegative xor z2.isNegative then
       
   373     b:= z1.isNegative
       
   374 else
       
   375 (*  Not so sure this specialcase is a win w/ Round/Frac. have to do more tests anyway.
       
   376     if (z1.Round = z2.Round and (z1.Frac = z2.Frac)) then
       
   377         b:= false
       
   378     else *)
       
   379         b:= ((z1.Round < z2.Round) or ((z1.Round = z2.Round) and (z1.Frac < z2.Frac))) <> z1.isNegative
       
   380 end;
       
   381 
       
   382 operator > (const z1, z2: hwFloat) b : boolean; inline;
       
   383 begin
       
   384 if z1.isNegative xor z2.isNegative then
       
   385     b:= z2.isNegative
       
   386 else
       
   387 (*
       
   388     if z1.QWordValue = z2.QWordValue then
       
   389         b:= false
       
   390     else*)
       
   391         b:= ((z1.Round > z2.Round) or ((z1.Round = z2.Round) and (z1.Frac > z2.Frac))) <> z1.isNegative
       
   392 end;
       
   393 
       
   394 function isZero(const z: hwFloat): boolean; inline; 
       
   395 begin
       
   396 isZero := (z.Round = 0) and (z.Frac = 0);
       
   397 end;
       
   398 {$ENDIF}
       
   399 
   293 
   400 operator - (const z1: hwFloat) z : hwFloat; inline;
   294 operator - (const z1: hwFloat) z : hwFloat; inline;
   401 begin
   295 begin
   402 z:= z1;
   296 z:= z1;
   403 z.isNegative:= not z.isNegative
   297 z.isNegative:= not z.isNegative