Article View: pl.comp.lang.asm
Article #2602Re: [1/3 NTG] C - Optymalizacje wstawkami
From: DMR
Date: Sun, 17 Feb 2019 20:17
Date: Sun, 17 Feb 2019 20:17
65 lines
4363 bytes
4363 bytes
> Także u mnie nie obserwuję "efektu sekund". Pewnie problem z glibc
> (tak, zdarzają się takie).
Z tego co doczytałem, pod Windowsem te funkcje obsługuje biblioteka MSVC Runtime - i pewnie tam są bugi... I dobrze, bo była okazja do rozkminy tematu. :-)
W ogóle chętnie przesiadłbym się na Linuksa, ale trzyma mnie CAD i Excel, do którego mam cały worek makr.
A już najlepiej, żeby był z podpiętym CDE - tyle, że chodziłby na nim co najwyżej soft, który bym sobie sam napisał... :-P
> zrobić swoje funkcje, lepiej pasujące do danych
Popełniłem wstępnie funkcję konwertującą double na stringa.
Dzieli liczbę na część rzeczywistą i ułamkową, a potem wyświetla do czterech miejsc po przecinku w ustawionym "na chama" buforze, ale narazie nie chodzi o finezję, tylko o przetestowanie rozwiązania:
//------------------------------------------------------------------------------
inline void DoubleToString(double dValue, char* cBuffer)
{
double dRnd;
unsigned int iReal, val;
char *ptr, *dot;
ptr = cBuffer + 15;
dot = cBuffer + 10;
*ptr = '\0';
*dot = '.';
dRnd = dValue + 0.00005; // zaokrąglenie czwartej cyfry
iReal = (int)dRnd;
val = (int)((dRnd - iReal) * 10000.0); // część ułamkowa *)
while (val)
{
*--ptr = char(val % 10) | '0';
val /= 10;
}
while (--ptr > dot) // zera do przecinka
*ptr = '0';
val = iReal; // część rzeczywista
while (val)
{
*--ptr = char(val % 10) | '0';
val /= 10;
}
while (ptr > cBuffer) // spacje do początku
*--ptr = ' ';
}
//------------------------------------------------------------------------------
W porównaniu do sprintf() wykonuje swoją pracę... piętnastokrotnie szybciej, więc tu jest jak najbardziej git! :-)
Od zwycięzcy: https://github.com/miloyip/dtoa-benchmark jest ponad trzykrotnie szybsza - nic zresztą dziwnego, bo tamten algorytm używa int-ów 64-bitowych, co w programie 32-bitowym musi kosztować.
Boję się tylko o jedno - że w linijce *) w jakimś perfidnym przypadku (liczby praktycznie całkowitej) pojawią się mikroskopijne błędy zaokrągleń, które jednak spowodują "przekręcenie" części ułamkowej względem rzeczywistej i zamiast 10.0000 wyjdzie 10.9999, czy jakoś tak.
Póki co katuję algorytm paczkami po kilkaset milionów liczb wygenerowanych według rozmaitych kluczy i porównuję wynik ze sprintf() - do tej pory NIGDY nie wywalił błędu (jedyne co kilka razy wyłapał, to różnicę na czwartym miejscu po przecinku dla liczb XXXXXX.XXXX5000...).
Ale że tu nie ma miejsca na żadne tego typu wypadki, to się boję... ;-)
No i znowu - miało być krótko... ;-)
Jest fajna instrukcja FISTTP, ale dopiero od późnego Pentium 4.
Technical Details
Message-ID:
<c77eea4d-735a-429d-9cb1-a792378213b3@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!fu-berlin.de!y22no353959ita.0!news-out.google.com!v188ni714itb.0!nntp.google.com!y42no320521ita.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mailReferences:
<30292520-12bd-49f0-b5ce-39c9af378a4c@googlegroups.com> <5c5b41d7$0$501$65785112@news.neostrada.pl> <781a3ad8-10bb-42aa-939f-dc6c11efa783@googlegroups.com> <5c5df439$0$476$65785112@news.neostrada.pl> <5e988bac-236b-42c4-8f94-87c5586d58d1@googlegroups.com> <5c632cc2$0$492$65785112@news.neostrada.pl> <17dc9fb7-38b2-4278-a1fc-d7b9c4746e70@googlegroups.com> <5c697caa$0$476$65785112@news.neostrada.pl>Show Full Headers
Complete Article Headers
X-Received: by 2002:a6b:b281:: with SMTP id b123mr15553965iof.39.1550434645550; Sun, 17 Feb 2019 12:17:25 -0800 (PST) X-Received: by 2002:a9d:654f:: with SMTP id q15mr191683otl.6.1550434645319; Sun, 17 Feb 2019 12:17:25 -0800 (PST) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!fu-berlin.de!y22no353959ita.0!news-out.google.com!v188ni714itb.0!nntp.google.com!y42no320521ita.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.asm Date: Sun, 17 Feb 2019 12:17:24 -0800 (PST) In-Reply-To: <5c697caa$0$476$65785112@news.neostrada.pl> Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=80.238.104.22; posting-account=FE4hoAoAAADKg8EtnA4bEyQiJf7iqAgV NNTP-Posting-Host: 80.238.104.22 References: <30292520-12bd-49f0-b5ce-39c9af378a4c@googlegroups.com> <5c5b41d7$0$501$65785112@news.neostrada.pl> <781a3ad8-10bb-42aa-939f-dc6c11efa783@googlegroups.com> <5c5df439$0$476$65785112@news.neostrada.pl> <5e988bac-236b-42c4-8f94-87c5586d58d1@googlegroups.com> <5c632cc2$0$492$65785112@news.neostrada.pl> <17dc9fb7-38b2-4278-a1fc-d7b9c4746e70@googlegroups.com> <5c697caa$0$476$65785112@news.neostrada.pl> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <c77eea4d-735a-429d-9cb1-a792378213b3@googlegroups.com> Subject: Re: [1/3 NTG] C - Optymalizacje wstawkami From: DMR <mezzogm@gmail.com> Injection-Date: Sun, 17 Feb 2019 20:17:25 +0000 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit