Warning: mysqli::__construct(): (HY000/1203): User howardkn already has more than 'max_user_connections' active connections in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\includes\artfuncs.php on line 21
Failed to connect to MySQL: (1203) User howardkn already has more than 'max_user_connections' active connections
Warning: mysqli::query(): Couldn't fetch mysqli in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\index.php on line 66
Article <6729ED5E.30500@grunge.pl>
Deutsch   English   Français   Italiano  
<6729ED5E.30500@grunge.pl>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!news.misty.com!weretis.net!feeder9.news.weretis.net!news.nk.ca!rocksolid2!i2pn2.org!.POSTED!not-for-mail
From: fir <fir@grunge.pl>
Newsgroups: comp.lang.c
Subject: Re: is double slower?
Date: Tue, 05 Nov 2024 11:03:10 +0100
Organization: i2pn2 (i2pn.org)
Message-ID: <6729ED5E.30500@grunge.pl>
References: <4d5973952030c993c48f93329fc25be7f236e2c5@i2pn2.org> <vgck4n$1e7dd$1@dont-email.me> <6729EA1E.60703@grunge.pl>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Info: i2pn2.org;
	logging-data="1040335"; mail-complaints-to="usenet@i2pn2.org";
	posting-account="+ydHcGjgSeBt3Wz3WTfKefUptpAWaXduqfw5xdfsuS0";
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0 SeaMonkey/2.24
To: David Brown <david.brown@hesbynett.no>
X-Spam-Checker-Version: SpamAssassin 4.0.0
In-Reply-To: <6729EA1E.60703@grunge.pl>
Bytes: 6662
Lines: 169

fir wrote:
> David Brown wrote:
>> On 04/11/2024 08:53, fir wrote:
>>> float takes less space and when you keep arrays of floats for sure float
>>> is better (less spase and uses less memory bandwidth so i guess floats
>>> can be as twice faster in some aspects)
>>>
>>
>> Certainly if you have a lot of them, then the memory bandwidth and cache
>> it rate can make floats faster than doubles.
>>
>>> but when you do calculations on local variables not floats do the
>>> double is slower?
>>
>> I assume that for the calculations in question, the accuracy and range
>> of float is enough - otherwise the answer is obviously use doubles.
>>
>>
>> This is going to depend on the cpu, the type of instructions, the source
>> code in question, the compiler and the options.  So there is no single
>> easy answer.
>>
>> You can, as Bonita suggested, look up instruction timing information at
>> agner.org for the cpu you are using (assuming it's an x86 device) to get
>> some idea of any fundamental differences in timings.  Usually for modern
>> "big" processors, basic operations such as addition and multiplication
>> are single cycle or faster (i.e., multiple instructions can be done in
>> parallel) for float and double.  But division, square root, and other
>> more complex operations can take a lot longer with doubles.
>>
>> Next, consider if you can be using vector or SIMD operations.  On some
>> devices, you can do that with floats but not doubles - and even if you
>> can use doubles, you can usually run floats at twice the rate.
>>
>>
>> In the source code, remember it is very easy to accidentally promote to
>> double when writing in C.  If you want to stick to floats, make sure you
>> don't use double-precision constants - a missing "f" suffix can change a
>> whole expression into double calculations.  Remember that it takes time
>> to convert between float and double.
>>
>>
>> Then look at your compiler flags - these can make a big difference to
>> the speed of floating point code.  I'm giving gcc flags, because those
>> are the ones I know - if you are using another compiler, look at the
>> details of its flags.
>>
>> Obviously you want optimisation enabled if speed is relevant - -O2 is a
>> good start.  Make sure you are optimising for the cpu(s) you are using -
>> "-march=native" is good for local programs, but you will want something
>> more specific if the binary needs to run on a variety of machines.  The
>> closer you are to the exact cpu model, the better the code scheduling
>> and instruction choice can be.
>>
>> Look closely at "-ffast-math" in the gcc manual.  If that is suitable
>> for your code (and it often is), it can make a huge difference to
>> floating point intensive code.  If it is unsuitable because you have
>> infinities, or need deterministic control of things like associativity,
>> it will make your results wrong.
>>
>> "-Wdouble-promotion" can be helpful to spot accidental use of doubles in
>> what you think is a float expression.  "-Wfloat-equal" is a good idea,
>> especially if you are mixing floats and doubles.  "-Wfloat-conversion"
>> will warn about implicit conversions from doubles to floats (or to
>> integers).
>>
>>
>>
> the code that seem to speeded up a bit when turning float to double is
>
>   union Color
>   {
>     unsigned u;
>     struct { unsigned char b,g,r,a;};
>    };
>
>
> inline float distance2d_(float x1, float y1, float x2, float y2)
>   {
>    return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
>   }
>
> inline unsigned GetPixelUnsafe_(int x, int y)
>   {
>     return frame_bitmap[y*frame_size_x+x];
>   }
> inline void SetPixelUnsafe_(int x, int y, unsigned color)
> {
>    frame_bitmap[y*frame_size_x+x]=color;
> }
>
> void DrawPoint(int i)
> {
>     // if(!point[i].enabled) return;
>
>      int xq = point[i].x;
>      int yq = point[i].y;
>
>      Color c;
>      Color bc;
>
>      if(d_toggler)
>      {
> //     DrawCircle(xq,yq,point[i].radius,0xffffff);
>       FillCircle(xq,yq,point[i].radius,point[i].c.u);
>
>       return;
>      }
>
>     float R = point[i].radius*5;
>
>     int y_start = max(0, yq-R);
>     int y_end = min(frame_size_y, yq+R);
>     int x_start = max(0, xq-R);
>     int x_end = min(frame_size_x, xq+R);
>
>    for(int y = y_start; y<y_end; y++)
>    {
>    for(int x = x_start; x<x_end; x++)
>     {
>       //fere below was float ->
>      double p = (R - distance2d_(x,y,point[i].x,point[i].y));
>
>
>      if(!i_toggler)
>      {
>       if(p<0.4*R) continue;
>      }
>      else
>        if(p<0) continue;
>
>        p/=R;
>
>        bc.u = GetPixelUnsafe_(x,y);
>        int r = bc.r + (point[i].c.r)* p*p*p;
>        int g = bc.g + (point[i].c.g)* p*p*p;
>        int b = bc.b + (point[i].c.b)* p*p*p;
>
>        if(!r_toggler)
>        {
>        if(r>255) r = 255;
>        if(g>255) g = 255;
>        if(b>255) b = 255;
>        }
>
>        c.r = r;
>        c.g = g;
>        c.b = b;
>
>        SetPixelUnsafe_(x,y,c.u);
>
>     }
>     }
>
> }
>
> this just draws something like little light that darkens as 1/(r*r*r)
> and is able to add n-lights in place to mix colors end eventually
> "overlight" (so this is kinda blending)
>
> its very time consuming liek draving 100 of them (rhen r is 9) was
> taking 35 ms on old machine afair)

some can test it BTW

 
https://drive.google.com/file/d/1-Obb6F19h5yfCbCETP4-VFoV3XYGpRsN/view?usp=sharing

its for windows but worx under wine afair /and on linux wirtual machine 
on windows also (afair, i dont know as i got only windows)