🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #2602

Re: [1/3 NTG] C - Optymalizacje wstawkami

#2602
From: DMR
Date: Sun, 17 Feb 2019 20:17
65 lines
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-mail
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>

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