Registriert seit: 17. Nov 2005
Ort: Hamburg
1.077 Beiträge
Delphi XE2 Professional
|
AW: Rechenprogramm
27. Sep 2020, 00:44
Hallo Profi
Wichtigere Frage... Wieso kann ich mit deinem Rechner "nur" bis 1754! rechnen?
Gruss
M
Hab ich mit PN beantwortet, hier noch mal für andere.
Das Maximum 1754 für N! (im Normal-Modus) resultiert aus dem größten in einem Extended darstellbaren Wert (1.1E+4932).
1755! ergäbe 3.473E+4933 und würde den Maximalwert überschreiten.
Übrigens:
Im Normal-Modus werden in meinem Programm alle Werte in Extended-Variablen gespeichert, was auch der Grund ist, warum es keine 64Bit Version gibt (Da ist Extended = Double).
Tatsächlich rechne ich N! mit der FPU. Hier der Code
Delphi-Quellcode:
PROCEDURE MonOpFacul( var V:TValue);
asm // EAX=@TValue
// CheckMinMax(v.v,0,1754,pact,116);
// n:=Trunc(v.v);
// v.v:=1;
// while n>1 do begin
// v.v:=v.v*n;
// dec(n);
// end;
// ASM Version braucht 1/6 der Zeit und ist kürzer, auch wenns
// nicht so aussieht.
mov byte [eax].TValue.Vt,vtNone
fld tbyte[eax].TValue.V
fldz
fcomip st,st(1)
ja @Err
fild dword [@1754]
fcomip st,st(1)
jae @Ok
@Err: mov eax,117
mov edx,pact
jmp ASMError1
@1754: dd 1754
@Ok: sub esp,8
fnstcw word [esp+4]
fnstcw word [esp+6]
fwait
or word [ESP+4], $0F00 // trunc toward zero, full precision
fldcw word [ESP+4]
fistp dword [esp]
fwait
fldcw word [esp+6]
fld1
mov edx,[esp]
sub edx,1
jbe @Fin
@Loop: fimul dword [esp]
mov [esp],edx
sub edx,1
ja @Loop
@Fin: fstp tbyte[eax].TValue.V
add esp,8
end;
Delphi-Quellcode:
// Vom Parser benutzter Werte-Record
// CanDeformat : Info, ob der von NumStr erzeugte Ausgabe-String
// wieder deformatiert werden kann
// Vt : Wofür der Wert steht
// V : Der numerische Wert
// Numerator : Zähler, wenn Vt=vtFraction
// Denominator : Nenner, wenn Vt=vtFraction
// Latitude : Breitengrad, wenn Vt=vtGeoPos
// Longitude : Längengrad, wenn Vt=vtGeoPos
// ClrVal : Fabbdaten, wenn Vt=vtColor
TValue=packed Record
CanDeformat:Boolean;
Vt:TValueType;
V:Extended;
case Integer of
1 : (Numerator:Extended;
Denominator:Extended);
2 : (Latitude:Extended;
Longitude:Extended);
3 : (LatLon:Array[Boolean] of Extended);
4 : (ClrVal:TColorValue);
end;
// Wofür ein Wert steht (vtNone=einfache Zahl)
TValueType=(vtNone,vtBool,vtColor,vtFraction,
vtSeconds,vtMinutes,vtHours,vtDays,vtWeeks,vtMonths,vtYears,
vtTime,vtDate,vtDateTime,
vtGeoPos);
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
|