hedgewars/uFloat.pas
changeset 7614 3ae60c8a15f2
parent 7594 5f03595335e6
child 7623 addc5b262617
equal deleted inserted replaced
7612:047c6692a2e7 7614:3ae60c8a15f2
   210 int2hwFloat.Frac:= 0
   210 int2hwFloat.Frac:= 0
   211 end;
   211 end;
   212 
   212 
   213 function hwFloat2Float (const i: hwFloat) : extended;
   213 function hwFloat2Float (const i: hwFloat) : extended;
   214 begin
   214 begin
   215 hwFloat2Float:= i.QWordValue / $100000000;
   215 hwFloat2Float:= i.Frac / $100000000 + i.Round;
   216 if i.isNegative then
   216 if i.isNegative then
   217     hwFloat2Float:= -hwFloat2Float;
   217     hwFloat2Float:= -hwFloat2Float;
   218 end;
   218 end;
   219 
   219 
       
   220 {$IFNDEF WEB}
   220 operator = (const z1, z2: hwFloat) z : boolean; inline;
   221 operator = (const z1, z2: hwFloat) z : boolean; inline;
   221 begin
   222 begin
   222     z:= (z1.isNegative = z2.isNegative) and (z1.QWordValue = z2.QWordValue);
   223     z:= (z1.isNegative = z2.isNegative) and (z1.QWordValue = z2.QWordValue);
   223 end;
   224 end;
   224 
   225 
   266     begin
   267     begin
   267     z.isNegative:= z1.isNegative;
   268     z.isNegative:= z1.isNegative;
   268     z.QWordValue:= z1.QWordValue + z2.QWordValue
   269     z.QWordValue:= z1.QWordValue + z2.QWordValue
   269     end
   270     end
   270 end;
   271 end;
       
   272 {$ENDIF}
       
   273 {$IFDEF WEB}
       
   274 (*
       
   275     Mostly to be kind to JS as of 2012-08-27 where there is no int64/uint64.  This may change though.
       
   276 *)
       
   277 operator = (const z1, z2: hwFloat) z : boolean; inline;
       
   278 begin
       
   279     z:= (z1.isNegative = z2.isNegative) and (z1.Frac = z2.Frac) and (z1.Round = z2.Round);
       
   280 end;
       
   281 
       
   282 operator <> (const z1, z2: hwFloat) z : boolean; inline;
       
   283 begin
       
   284     z:= (z1.isNegative <> z2.isNegative) or (z1.Frac <> z2.Frac) or (z1.Round <> z2.Round);
       
   285 end;
       
   286 
       
   287 operator + (const z1, z2: hwFloat) z : hwFloat;
       
   288 begin
       
   289 if z1.isNegative = z2.isNegative then
       
   290     begin
       
   291 //  z.QWordValue:= z1.QWordValue + z2.QWordValue
       
   292     z:= z1;
       
   293     z.Frac:= z.Frac + z2.Frac;
       
   294     z.Round:= z.Round + z2.Round;
       
   295     if z.Frac<z1.Frac then inc(z.Round)
       
   296     end
       
   297 else
       
   298 //  if z1.QWordValue > z2.QWordValue then
       
   299     if (z1.Round > z2.Round) or ((z1.Round = z2.Round) and (z1.Frac > z2.Frac)) then
       
   300         begin
       
   301         z.isNegative:= z1.isNegative;
       
   302 //      z.QWordValue:= z1.QWordValue - z2.QWordValue
       
   303         z.Round:= z1.Round - z2.Round;
       
   304         z.Frac:= z1.Frac - z2.Frac;
       
   305         if z2.Frac > z1.Frac then dec(z.Round)
       
   306         end
       
   307     else
       
   308         begin
       
   309         z.isNegative:= z2.isNegative;
       
   310 //      z.QWordValue:= z2.QWordValue - z1.QWordValue
       
   311         z.Round:= z2.Round - z1.Round;
       
   312         z.Frac:= z2.Frac-z1.Frac;
       
   313         if z2.Frac < z1.Frac then dec(z.Round)
       
   314         end
       
   315 end;
       
   316 
       
   317 operator - (const z1, z2: hwFloat) z : hwFloat;
       
   318 begin
       
   319 if z1.isNegative = z2.isNegative then
       
   320 //  if z1.QWordValue > z2.QWordValue then
       
   321     if (z1.Round > z2.Round) or ((z1.Round = z2.Round) and (z1.Frac > z2.Frac)) then
       
   322         begin
       
   323         z.isNegative:= z1.isNegative;
       
   324 //      z.QWordValue:= z1.QWordValue - z2.QWordValue
       
   325         z.Round:= z1.Round - z2.Round;
       
   326         z.Frac:= z1.Frac-z2.Frac;
       
   327         if z2.Frac > z1.Frac then dec(z.Round)
       
   328         end
       
   329     else
       
   330         begin
       
   331         z.isNegative:= not z2.isNegative;
       
   332 //      z.QWordValue:= z2.QWordValue - z1.QWordValue
       
   333         z.Round:= z2.Round - z1.Round;
       
   334         z.Frac:= z2.Frac-z1.Frac;
       
   335         if z2.Frac < z1.Frac then dec(z.Round)
       
   336         end
       
   337 else
       
   338     begin
       
   339 //  z.QWordValue:= z1.QWordValue + z2.QWordValue
       
   340     z:= z1;
       
   341     z.Frac:= z.Frac + z2.Frac;
       
   342     z.Round:= z.Round + z2.Round;
       
   343     if z.Frac<z1.Frac then inc(z.Round)
       
   344     end
       
   345 end;
       
   346 {$ENDIF}
   271 
   347 
   272 operator - (const z1: hwFloat) z : hwFloat;
   348 operator - (const z1: hwFloat) z : hwFloat;
   273 begin
   349 begin
   274 z:= z1;
   350 z:= z1;
   275 z.isNegative:= not z.isNegative
   351 z.isNegative:= not z.isNegative