"Helmut Waitzmann" <
nn.th...@xoxy.net> schrieb:
> Helmut Schellong <
r...@schellong.biz>:
>>On 05/29/2022 10:14, Bonita Montero wrote:
>>> The trunc() implementation of VC++'s runtime was too slow for me,
>>> so I've written my own:
>>>
>>> [...]
>>Falls Du damit ein Abschneiden eines Dateiinhaltes meinst -
>>die Dateigröße kann direkt auf eine bestimmte Größe gesetzt werden.
AUTSCH! trunc() <> truncate()
Schellong demonstriert 'mal wieder, dass er von C KEINE AHNUNG hat!
> Es lohnt nicht, auf den Beitrag von Unbekannt, alias Bonita Montero,
> alias Malito Molesto, einzugehen. Er enthält keinen Code der
> Programmiersprache C und hat auch sonst nichts mit ihr zu tun.
Abgesehen davon: niemand mit klarem Verstand implementiert eine TRIVIALE
Funktion wie trunc() in C oder gar C++!
Vor allem nicht fuer Windows, von dem 99.99+% aller Installationen auf
Intel-Prozessoren laufen, deren SSE 4.1-Befehlssatz seit 14.5 (in Worten:
VIERZEHNEINHALB) Jahren ROUNDSS/ROUNDSD kennt!
JFTR: fuer 64-bittige Altherthuemer implementiert jeder nicht voellig
Ahnungslose stattdessen folgende Befehlssequenz, gerne auch mit
den allen Compiler-Herstellern von Intel zur Verfuegung gestellten
SSE-Intrinsics:
; argument in xmm0
mov rax, 4330000000000000h
movq xmm2, rax ; xmm2 = 0x1.0p+52 = minimum non-fractional number
mov rax, 3FF0000000000000h
xorpd xmm1, xmm1 ; xmm1 = 0.0
subsd xmm1, xmm0 ; xmm1 = -argument
andpd xmm1, xmm0 ; xmm1 = |argument|
xorpd xmm0, xmm1 ; xmm0 = (argument & -0.0) ? -0.0 : +0.0
movsd xmm3, xmm1 ; xmm3 = |argument|
addsd xmm1, xmm2 ; xmm1 = |argument| + 0x1.0p+52
subsd xmm1, xmm2 ; xmm1 = |argument| - 0x1.0p+52 = rint(|argument|)
movq xmm2, rax ; xmm2 = 0x1.0p+0
cmpsd xmm3, xmm1, 1 ; xmm3 = (|argument| < rint(|argument|)) ? ~0 : 0
andpd xmm3, xmm2 ; xmm3 = (|argument| < rint(|argument|)) ? 1.0 : 0.0
subsd xmm1, xmm3 ; xmm1 = (|argument| < rint(|argument|)) ? -1.0 : 0.0
orpd xmm0, xmm1 ; xmm0 = trunc(argument)
Und fuer 32-bittige C-Programme, die dummerweise noch die FPU missbrauchen,
natuerlich ohne bedingte Spruenge oder den Missbrauch der Ganzzahl-Register:
; argument in st(0)
fld st(0)
fabs
fld st(0)
frndint ; st(0) = rint(argument), st(1) = |argument|, st(2) = argument
fxch st(1)
fucomip st(0), st(1)
fldz
fld1
fcmovnb st(0), st(1) ; st(0) = rint(|argument|) <= |argument| ? 0.0 : 1.0, st(1) = 0.0,
; st(2) = rint(argument), st(3) = argument
fsubp st(2), st(0) ; st(0) = 0.0, st(1) = trunc(|argument|), st(2) = argument
fucomip st(0), st(2)
fst st(1)
fchs ; st(0) = -trunc(|argument|), st(1) = trunc(|argument|)
fcmovbe st(0), st(1)
fstp st(1) ; st(0) = trunc(argument)
>> Außerdem ist die Verkehrssprache hier deutsch. Wer auf Englisch
>> Belange der Programmiersprache C diskutieren will, kann das in den
>> entsprechenden Gruppen der «comp.lang.all»-Hierarchie tun.
>
> Kurz: Malitos Beitrag ist hier offtopic.
Immerhin taugt er hervorragend als SCHLECHTES Beispiel, und das sogar in
mehrfacher Hinsicht.
Stefan
--
<
https://www.duden.de/rechtschreibung/Kanthaken>