baron3d skrev: ↑26 juni 2025, 21:52:09
Shifta talet ett steg åt höger.
Binär skiftning av integern 587 ger decimala talet 293 vilket borde blivit 293,5 som flyttal.
Bitskiftar vi tillbaka från 293 blir det 586.
Om man assembler-programmerar och vill lasta processorn så lite som möjligt men ändå behålla tal-precision kan man börja med att skifta decimala talet åt vänster till 5870 (lägga till en nolla i strängen) och sedan binärskifta åt höger vilket decimalt blir 2935.
Nu är det bara att lägga till ett komma-tecken innan sista siffran.
Det går på samma sätt dividera med 3 genom itererande binär bitskiftning men ett enklare sätt kan vara att omvandla 587(10) till talbasen 3, 210202(3) och sedan högerskifta en gång vilket ger 195(10) som integer. Flyttal 195.666.. Det går även lägga till några nollor på utgångstalet för bättre precision så länge man inte skapar unsigned integers större än vad processorn hanterar.
Sådan skiftning fungerar för alla talbaser. Vill man dividera med 10 är det bekvämt då talbasen redan är decimal. 587 blir 58 efter en högerskift. Att öka precisionen till flyttal görs som ovan, börja med en vänsterskift för att sedan stoppa in decimalkommat före sista siffran men en decimal vänster-skift för att sedan följas av en decimal högerskift är meningslös så här räcker det med att direkt flytta komma-tecknet ett steg.
Samma sak gäller för andra talbaser där man vill utför enkla multiplikationer eller divisioner utan att belasta processorn för mycket. Binära flyttal kan t.ex. skiftas för enkel division eller multiplikation med 2,4,8.. genom att flytta binära komma-tecknet ett antal steg men så kan man även göra med andra talbaser.
I många fall om det är enkla siffror i matematiska operationerna som ständigt återkommer så kan man ibland tjäna på att bygga upp indexerade tabeller över nummerserier för olika talbaser. för att slippa fundera på omvandlingen mellan olika talbaser och på så sätt minska lasten i utbyte mot ökat minnesutrymme för tabeller.
Enkelt exempel där man kan tjäna på sådan matematik är om man ska beräkna färg-pixel för Mandelbrot-mämgd där man kan låta rest-värdet vid itererande division ange färgen.
Vad gäller huvudräkning av typen att dela 587 med 2 eller 3, börja med avrundning till en enda värdesiffra => 600 (587+13) för enkel matematik. 600 är enkel att dela med 2 eller 3. Resttalet 13 är även det enkelt att dela med dessa siffror utan någon större kalkyl i huvudet.
587 är prim-nummer så den saknar andra divisorer utom sej själv och ett, som inte ger en rest. Det går grov-kontrollera även det mha huvudräkning:
587 slutar på udda siffra som inte är 5.
5+8+7 är inte delbart med 3.
Det finns tal som felaktigt anges som primtal med denna kontrollen men duger som snabb-koll innan man gör ytterligare kontroll.
Ska man vara helt säker på om det är ett primtal får man även kolla så talet inte är möjligt att dividera jämnt med primtalen 7, 11, 13, 17 eller 23.
Det är bra att välja jämna siffror även här för enkel kontroll mha huvudräkning.
Det första jag noterar är att 587 kan ses som 600-13 som är enklare siffror att huvudräkna med.
Två exempel vid koll om det är primtal:
11 är en lätt siffra att kontrollera då det är enkelt att multiplicera med 11.
11x50 ger 550. Siffran 50 var den enkla siffra som först gav ett värde i närheten av 587 vid multiplikation med 11 vid snabbt överslag.
Resten, 587-550, är 37 som inte kan delas jämnt med 11.
Talet 13 som jämn divisor kollas på liknande sätt.
Om man missar i antagandet hur stor en jämn multiplikator max kan vara gör det inget. Ett enkelt val hade varit 40 då 40x13 är lätt att beräkna. 4 är två dubblingar av 13 (26, 52) och en nolla så blir det 520. 587-520 är 67 som inte kan delas med 13.
Om man istället för 40 valt 50 som enkel multiplikator så gör det inget och 50 är också en enkel siffra att multiplicera som en halvering av 13 och sedan flytta decimalkommat två ggr.
13x50=650
Vid beräkning av skillnaden 650-587 tar jag i huvudet siffrorna (13+50) = 63 som inte kan delas jämnt med 13.
Fortsätter på samma sätt med övriga siffror för att vara helt säker på att det är ett primtal.