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 |