Difference between the two ways of multiplying UGen

Hello SC Users.
I have two questions about multiplying UGen.

Below code is two ways of multiplying UGens repeatedly.
I thought the results should be same but they are different at squared.
Especially the sign of the signal.
Why? I am so wondering the reason.

{[SinOsc.ar(1), SinOsc.ar(1) * SinOsc.ar(1), SinOsc.ar(1) * SinOsc.ar(1) * SinOsc.ar(1), ]}.plot(1);


As you can see the result from code below,
the more WhiteNoise is multiplied, the smaller the signal.
Is it because the sample values ​​being multiplied can have more probability of meeting a number close to 0?

{WhiteNoise.ar(1) * WhiteNoise.ar(1)}.play;
{WhiteNoise.ar(1) * WhiteNoise.ar(1) * WhiteNoise.ar(1)}.play;
{WhiteNoise.ar(1) * WhiteNoise.ar(1) * WhiteNoise.ar(1) * WhiteNoise.ar(1)}.play;
{WhiteNoise.ar(1) * WhiteNoise.ar(1) * WhiteNoise.ar(1) * WhiteNoise.ar(1) * WhiteNoise.ar(1)}.play;

Have a good day.
Thank you.

Ah, this isn’t really a supercollider question as much as a weird/useful quirk of common DSP programs.

Exponentials preserve the sign of the value in most DSP program, whereas in maths, it wouldn’t. This is because most of the time when you square/cube/(etc) you want to change the shape of the wave, altering the harmonic content, as oppose to creating a DC offset.

Supercollider will do this - -4.pow(2) - the mathematical way and this - SinOsc.ar().pow(2) - the dsp way, changing the shape, but preserving the sign.

That is a bit confusing the inconsistency.
But it’s true it is useful sometimes though.

Thank you for your reply.
If you didn’t explain, it could be an embarrassing mystery :slight_smile: