Groups | Search | Server Info | Login | Register


Groups > pl.comp.lang.asm > #19

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

Newsgroups pl.comp.lang.asm
Date 2019-02-17 12:17 -0800
References (3 earlier) <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>
Message-ID <c77eea4d-735a-429d-9cb1-a792378213b3@googlegroups.com> (permalink)
Subject Re: [1/3 NTG] C - Optymalizacje wstawkami
From DMR <mezzogm@gmail.com>

Show all headers | View raw


> 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.

Back to pl.comp.lang.asm | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

[1/3 NTG] C - Optymalizacje wstawkami DMR <mezzogm@gmail.com> - 2019-02-04 09:19 -0800
  Re: [1/3 NTG] C - Optymalizacje wstawkami "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> - 2019-02-06 21:21 +0100
    Re: [1/3 NTG] C - Optymalizacje wstawkami DMR <mezzogm@gmail.com> - 2019-02-08 09:31 -0800
      Re: [1/3 NTG] C - Optymalizacje wstawkami "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> - 2019-02-08 22:27 +0100
        Re: [1/3 NTG] C - Optymalizacje wstawkami mezzogm@gmail.com - 2019-02-11 07:56 -0800
          Re: [1/3 NTG] C - Optymalizacje wstawkami "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> - 2019-02-12 21:23 +0100
            Re: [1/3 NTG] C - Optymalizacje wstawkami DMR <mezzogm@gmail.com> - 2019-02-12 15:07 -0800
            Re: [1/3 NTG] C - Optymalizacje wstawkami "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> - 2019-02-13 20:38 +0100
        Re: [1/3 NTG] C - Optymalizacje wstawkami DMR <mezzogm@gmail.com> - 2019-02-12 08:04 -0800
          Re: [1/3 NTG] C - Optymalizacje wstawkami "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> - 2019-02-12 21:29 +0100
            Re: [1/3 NTG] C - Optymalizacje wstawkami DMR <mezzogm@gmail.com> - 2019-02-13 10:12 -0800
              Re: [1/3 NTG] C - Optymalizacje wstawkami "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> - 2019-02-17 16:24 +0100
                Re: [1/3 NTG] C - Optymalizacje wstawkami DMR <mezzogm@gmail.com> - 2019-02-17 12:17 -0800
                Re: [1/3 NTG] C - Optymalizacje wstawkami "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> - 2019-02-19 19:58 +0100
                Re: [1/3 NTG] C - Optymalizacje wstawkami DMR <mezzogm@gmail.com> - 2019-02-20 00:53 -0800
                Re: [1/3 NTG] C - Optymalizacje wstawkami DMR <mezzogm@gmail.com> - 2020-01-12 09:27 -0800
  Re: [1/3 NTG] C - Optymalizacje wstawkami DMR <mezzogm@gmail.com> - 2019-06-06 02:27 -0700
    Re: [1/3 NTG] C - Optymalizacje wstawkami "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> - 2019-06-08 23:26 +0200
      Re: [1/3 NTG] C - Optymalizacje wstawkami DMR <mezzogm@gmail.com> - 2019-06-10 09:05 -0700

csiph-web