Permalänk
Hedersmedlem

modulus och double i C?

Går det? Den vill inte för mig. :/
Jag leker lite med matteprogram, men jag ville att det skulle klara högre tal än 4,2M, så jag bytte mina ulong's till double istället, men då vill inte denna rad:
if ( !(n % j) ) <bla>;
"invalid operands to binary %"

Finns det nåt liknande sätt eller hur ska man göra?

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

byt ut dom mot __int64(msvc) eller long long (gcc)

eller använd fmod

Visa signatur

Teeworlds - För dig som gillar gulliga saker med stora vapen.

Permalänk
Hedersmedlem

Hm, jag hittade fmod genom att rota runt lite, men den funkar ändå inte som jag vill.
n och j är doubles uppenbarligen.
n: 6.000000, j: 2.000000, fmod(n,j): 0.000000
n: 6.000000, j: 3.000000, fmod(n,j): 0.000000
n: 6.000000, j: 4.000000, fmod(n,j): 0.000000 <-- 0?

Klarar en 'long long' lika höga tal som double? (egentligen så är det skitsamma för extremt höga, men minst 10 000 000 000 ska det klara).

Edit: Hmm igen.

unsigned long long inputnumber;
scanf("%lU", &inputnumber);
printf("%lU\n", inputnumber);
(det står LU, inte IU)
Skriver ut:
%U

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

int main()
{
printf("%f", fmod(6.0,4.0));
return 0;
}

printar ut 2.00000

Så här funkar det i MSVC:
__int64 Value = 2;
printf("%I64d\n", Value);

__int64 och long long är 64 bitars integer och kan hålla upp till 2^64-1 som unsigned och -2^63 till 2^63-1 som signed.

Visa signatur

Teeworlds - För dig som gillar gulliga saker med stora vapen.

Permalänk
Hedersmedlem

Heh, long long räcker tydligen (0 - 18446744073709551615 ). Jag tror att jag fick det att funka nu också, jag körde "%lld" i scanf och printf så skrev den ut det jag skrev in.
Nu ska vi se om det funkar med programmet också.
Edit: %lld verkar vara signed... den klarar "bara" hälften. Nåja det löser vi

Edit2:
Wee! Nu funkar hela programmet perfekt. Man tackar
%llu tror jag att jag kör för övrigt.

Edit3: Äh jag hann innan.
Tack ändå

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

printf("%llu\n") skall det då vara. u = unsigned, d = signed

Visa signatur

Teeworlds - För dig som gillar gulliga saker med stora vapen.

Permalänk
Hedersmedlem

Hm, nästa fråga...
Hur vet man om ett tal (long long här också) är jämnt? Dvs att (j/n*100) är t ex 50, och inte 50.3 eller 54.22? Jag vill skriva ut ett tecken varannan procent det beräknat.
j = färdiga tal (talet den är på)
n = antalet tal
Skriva varannat kan jag, men..

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Det kollar du ju med hjälp av modules (stavning?).

if( j % n == 0 )
//jämt
else
//decimaler

edit

Visa signatur

//cykze

Permalänk
Hedersmedlem

Jo, så långt vet jag, men... Det säger väl inget om talet är "helt" eller inte? Kollar man inte det med %2 förresten?

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Jämnt: if (x & 1) // Då är första bitten satt = icke jämnt

Visa signatur

Perl - Made by Idiots, Java - Made for Idiots, C++ - Envied by Idiots

Permalänk
Hedersmedlem

&1 och %2 funkade på precis samma sätt. Men, det är inte mitt problem just nu, jag sa ju att jag redan kunde.
Jag vill att den ska skriva ut ett "=" varannan procent den gör... Alltså måste jag kolla om procenten är "prick" eller inte. Om den visar 50.25 ska jag inte skriva ut, inte på 50.88 heller, men på 50, 52 och så vidare. Jag försökte att leka med avrundning och kolla, men det blev aldrig rätt ändå.
Edit: "Procenten" = (j/n*100)

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Men om "j % n == 0" så vet du ju att det är ett tal utan decimaler.

Visa signatur

//cykze

Permalänk
Hedersmedlem

Ah.
Nu blev det dock värre än jag trodde... Om talet man testar är för litet så skriver den inte ut många alls. T ex om 'n' är 10, så blir 'j' aldrig högre än 10, och den skriver verkligen inte ut 50 '='. Snark... Får fundera lite mer. :/
Edit: Dessutom så skriver den mer och mer ju högre talen är.. jag måste ha skrivit fel nån gång, ska kolla om ett tag.

Edit2: Nu dumpar jag lite av procentsystemet helt, jag kom på ett bättre sätt.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Hedersmedlem

Så, nu är jag tillbaka igen.
Det går på tok för sakta som jag kör nu... Jag uppdaterar procentmätaren var 10M:e loop (tror jag det är), procentmätaren är ett eget "window" på 1 rad, 7 tecken i ncurses, men ändå går det segt.
Om talet är litet nog används den inte alls, vilket gör att små tal går fort, det skiljer endast nån millisekund mellan utan och med den. Däremot stora tal, som "100000000" skiljer det sig mellan 5325 och >10000ms.
Lite kod (fråga inte vad det gör )

for (j=1; j <= (n/2); j++) { if ( !(n % j) ) divcount++; if (j >= 10000000) if ( !(j % 10000000) ) { mvwprintw(percent, 0,0,"%.0lf%%", (double)j/n*200); wrefresh(percent); } } divcount++; // count the number itself

Om man kör den på "n = 10k" så tar det 0ms, 100k 5ms, 1M 52ms, 100M 10018ms (mot ~5000 utan mätaren). Nån som kan komma på ett sätt att snabba upp lite?

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200