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 |