BASIC
 
[È un linguaggio semplicissimo che puoi usare facilmente e ti consente di capire come opera software più sofisticato.  Puoi
anche preparare programmi che sviluppano calcoli ulteriori a quelli svolgibili con questi script e con WolframAlpha]
 
Metti il programma nella casella, clicca "Execute", se vuoi clicca "Show code".
 

Puoi provare ad eseguire il programma copiando e incollando quanto segue:

10 PRINT "Introduci il totale";
20 INPUT tot
30 PRINT "Introduci il numero delle persone che pagano"
40 INPUT N
50 PRINT "Ciascuno paga "; tot/N
60 GOTO 30

Quando compare "?" invece che cliccare [ok] puoi premere "a capo".

Ricarica (o "Aggiorna") per introdurre ed eseguire un nuovo programma

Questa è una versione equivalente:

10 INPUT "Introduci il totale "; tot
30 PRINT "Introduci il numero delle persone che pagano"
40 INPUT N
50 PRINT "Ciascuno paga "; tot/N
60 GOTO 30

Qualche spiegazione.  Ogni riga del programma è preceduta da un numero intero (0, 1, 2, ..., 10,..., 200, ...) che rappresenta l'ordine di esecuzione.  Nelle istruzioni di INPUT puoi far precedere la varibile di input ("tot" o "N" nell'esempio) da un commento racchiuso tra " e seguito da un punto e virgola.  I comandi (INPUT, PRINT, ...) possono essere scritti in maiuscolo o minuscolo.  Come variabili si possono usare singole lettere o più lettere, eventualmente seguite da una o più cifre; nel caso delle varibili le dimensioni contano:  x e X sono considerate variabili diverse.  Dopo PRINT si possono mettere più uscite, separate da ";" per averle appiccicate, separate da "," per avere separate da alcuni caratteri:
      10 print 2;30;4       2304 
      20 print 2,30,4       2   30   4

Nel caso di un programma come quello a fianco (in cui "SQR" indica la "radice quadrata") si piò ottenere l'uscita "Infinity" quando il programma si trova a fare la divisione 5/0, a indicare che se si dividesse un numero positivo per un numero piccolissimo si otterrebbe un numero grandissimo.  Si ottiene l'uscita "NaN", che sta per "non è un numero", quando si trova di fronte al calcolo di 0/0.    
10 INPUT "x = ? "; x
20 PRINT "x/(SQR(4)-2) = ", x/(SQR(4)-2)
30 GOTO 10

Di fronte al programma   10 PRIMT 2+3   compare un messaggio che inizia con "ERROR" a indicare che si è scritto un comando in modo errato.

In una riga si possono inserire più comandi, separati da un due punti (:).  Si possono utilizzare come input ed output oltre ai numeri anche "testi", ossia sequenze di lettere, racchiuse tra virgolette (").  Se una variabile viene usata per memorizzare un testo occorre che il suo nome finisca con $.  Posso concatenere più uscite usando un "+" o un ";". Posso usare anche ",", con effetti diversi:    
10 a$ = "2"+"3" : b = 3/4
20 PRINT "pippo" + a$ + ";  " + b


 

      Un'altra istruzione importante: IF ... THEN ... ("se ... allora ...").  Vediamo anche come si scrivono "≠", "≥" e "≤" ?
10 input "A = "; A
20 input "B = "; B
30 if A <> B then print "A diverso da B"
40 if A >= B then print "A maggiore o uguale a B"
50 if A <= B then print "A minore o uguale a B"
60 if A > B then print "A maggiore di B"
70 if A < B then print "A minore di B"
80 if A = B then print "A uguale a B"
90 goto 10

L'elevamento alla potenza nei comandi viene indiato con "^".  Nelle uscite una potenza di 10 viene indicata facendo precedere l'esponente da "e".  Anche nell'intodurre un numero come input si può usare questa notazione.  Esempi:

10 print 10^24, 10^-20   ->   1e+24   1e-20
10 input x : print x     ->  Introduco  10.5e3   Ottengo  10500
 

Di seguito sono indicate le principali parole chiave della versione del BASIC che stiamo usando, cioè le parole "riservate" che in tale linguaggio si utilizzano per indicare comandi, funzioni, …  Le parole chiave possone essere scritte sia in maiuscolo che in minuscolo.  Sono riportati anche vari esempi d'uso  (clicca, qui sotto, la parola chiave per accedere ai relativi esempi).  Altri esempi sono riportati più avanti.

 
   Classe                           Parole chiave comprese nella classe
 --------------------------------   ------------------------------------- 
 Controllo del flusso               END, FOR...NEXT, IF...THEN..ELSE
 del programma                      GOSUB...RETURN, GOTO, WHILE...WEND
                                    
 Commenti                           REM (o ')

 Dichiarazione di costanti e va-    DATA, DIM, READ 
 riabili, assegnazione di valori

 Periferica di input/output         CLS, INPUT, PRINT

 Elaborazione delle stringhe        ASC,  CHR$, INSTR, LEFT$, LEN
                                    MID$, RIGHT$, STR$, STRING$, VAL

 Esecuzione di calcoli               ^ , ABS, ASC, COS, INT, RND, SIN
                                    SQR, TAN, < > =, OR, AND, true/false
 

Per i valori di π e puoi usare 3.1415926535897932 e 6.2831853071795865. Per quello di e puoi usare 2.7182818284590452

05 I=1
10 A = RND : PRINT A; 
15 IF A > 1/2 THEN PRINT " > 1/2" ELSE PRINT " < 1/2"
20 I = I+1 : IF I=11 THEN END
35 GOTO 10

0.3309791684150696 < 1/2
0.9956300258636475 > 1/2
0.9195851683616638 > 1/2
0.33149659633636475 < 1/2
0.731931746006012 > 1/2
0.05961799621582031 < 1/2
0.17708414793014526 < 1/2
0.4606109857559204 < 1/2
0.889754593372345 > 1/2
0.2006514072418213 < 1/2

05 REM i primi 10 interi positivi, e quelli dispari
10 for i=1 to 10 : print i+" "; : next
20 print 
30 for i=1 to 10 step 2: print i+" "; : next

1 2 3 4 5 6 7 8 9 10
1 3 5 7 9 

05 ' pari o dispari?
10 input "N = "; N 
20 if N/2 = int(N/2) then gosub 50 else gosub 60
30 goto 10
50 print "   numero pari" : return
60 print "   numero dispari" : return

N =  0
   numero pari
N =  31
   numero dispari
N =  17
   numero dispari
N =  12
   numero pari
N = ...

10 input "k = "; k
20 gosub 100 : print "il segno di k e' "; sgn
30 goto 10
100 if k=0 then sgn = 0 else sgn = k/abs(k) 
110 return  ' viene calcolato il segno di k; abs = valore assoluto

k =  45
il segno di k e' 1
k =  -12
il segno di k e' -1
k =  0
il segno di k e' 0

Dopo  IF,  WHILE, ...  se vuoi mettere più comandi mettili in una riga a cui rinviare con un GOSUB.


10 PRINT "Introduci un qualunque numero"
15 OK=1
20 WHILE OK=1
30 INPUT "N = "; N
40 IF N/2 = INT(N/2) THEN risp$ = "pari" ELSE risp$ = "dispari"
50 PRINT risp$
60 INPUT "batti 1 per altro numero, 0 per smettere  "; OK
70 WEND

Introduci un qualunuque numero
N =  17
dispari
batti 1 per altro numero, 0 per smettere   1
N =  20
pari
batti 1 per altro numero, 0 per smettere  ...

10 DATA 1,2,3,4,5,6,7,8,9,10
20 READ a,b,c,d,e
30 PRINT a+b+c+d+e
40 READ a,b,c,d,e
50 PRINT a+b+c+d+e

15
40
10 ' Come contare una quantita' di dati messi in DATA
20 data 1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5
30 data 1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5
40 for i=1 to 1000 : read x : cls : print i; : next

65
O, meglio, mettendo un dato "strano" alla fine:
10 ' trucco per contare i dati: metto un dato "strano" alla fine
20 data 1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5
30 data 1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5
40 data 13579
50 n=0 : ok=1 : while ok=1 : read x : if x=13579 then ok=0 else n=n+1 : wend
60 print n      ' ho contato i dati; sono n

65
Vedi anche più avanti

05 ' la somma e il prodotto di 5 numeri
10 dim x(4)
15 ' le varibili indiciate partono dall'indice 0; quindi per 5 dati bastano x(0),...,x(4)
20 for i=0 to 4 : input x(i): next
30 sum=0 : prod=1
40 for i=0 to 4 : sum=sum+x(i) : prod=prod*x(i) : next
50 print "somma = "; sum; ", prodotto = "; prod

? 1
? 2
? 3
? 4
? 5
somma = 15, prodotto = 120
Ovviamente, avrei potuto usare solo x(1),...,x(5):
10 dim x(5)
20 for i=1 to 5 : input x(i): next
30 sum=0 : prod=1
40 for i=1 to 5 : sum=sum+x(i) : prod=prod*x(i) : next
50 print "somma = "; sum; ", prodotto = "; prod

10 INPUT "x = ";x : INPUT "y = ";y
20 PRINT "radice quadrata di x^2+y^2 = "; SQR(x^2+y^2)
30 GOTO 10

x =  3
y =  4
radice quadrata di x^2+y^2 = 5
x =  4
y =  5
radice quadrata di x^2+y^2 = 6.4031242374328485

I vari linguaggi di programmazione traducono i comandi che vengono introdotti in comandi più semplici che utilizzano solo operazioni molto elementari e che vengono eseguiti da un particolare linguaggio di programmazione (linguaggio macchina) presente sul computer.  Vediamo ad esempio, per avere un'idea, come il calcolo della radice quadrata può essere affrontato utilizzando solo le "quattro operazioni":
10 INPUT "introduci A e premi 'a capo' "; A
20 y = 1
30 y = (y + A/y) /2 : print y;"  ";
40 input "smetto? (1 SI', 0 NO) "; R
50 if R = 0 then goto 30 else goto 10

introduci A e premi 'a capo'  3
2  smetto? (1 SI', 0 NO)  0
1.75  smetto? (1 SI', 0 NO)  0
1.7321428571428572  smetto? (1 SI', 0 NO)  0
1.7320508100147274  smetto? (1 SI', 0 NO)  0
1.7320508075688772  smetto? (1 SI', 0 NO)  0
1.7320508075688772  smetto? (1 SI', 0 NO)
√3 = 1.7320508075688772

10 INPUT "x = ";x
20 PRINT "valore assoluto di x = "; ABS(x)
30 PRINT "parte intera di x = "; INT(x)
40 PRINT "arrotondamento agli interi = "; INT(x+1/2)
50 PRINT "arrotondamento ai centesimi = "; INT(x*100+1/2)/100
60 PRINT "arrotondamento alle centinaia x = "; INT(x/100+1/2)*100
70 GOTO 10

x =  12345.6789
valore assoluto di x = 12345.6789
parte intera di x = 12345
arrotondamento agli interi = 12346
arrotondamento ai centesimi = 12345.68
arrotondamento alle centinaia x = 12300

01 ' LEN = lunghezza di una frase, LEFT$(frase,i) carattere i-mo di
02 ' frase da sinistra, RIGHT$(frase,i) carattere i-mo da destra
10 PRINT "Inversione delle lettere di una frase"
15 INPUT "Premi a capo "; x$
20 CLS
30 INPUT "Scrivi la frase "; frase$
40 PRINT : PRINT "La frase inverita: ";
50 FOR lettera = 1 TO LEN(frase$)
60   PRINT LEFT$(RIGHT$(frase$,lettera),1);
70 NEXT

05 ' La funzione VAL produce il numero all'inizio di una frase
10 INPUT "batti una frase iniziante con dei numeri "; x$
20 PRINT VAL(x$)
30 GOTO 10

batti una frase iniziante con dei numeri  75 per 180
75
batti una frase iniziante con dei numeri  12.45 = 1245/100
12.45

05 ' ASC produce la codifica numerica (codice ASCII) di un carattere
06 ' CHR$ produce il carattere corrispondente ad una codifica numerica
10 INPUT "batti un carattere "; x$ : PRINT ASC(x$) : PRINT CHR$(ASC(x$)) : GOTO 10

batti un carattere  a
97
a
batti un carattere  b
98
b
batti un carattere  0
48
0
batti un carattere  1
49
1

10 print asc("A"), asc("a"), asc("Z"), asc("z"), asc("a")-asc("A")
65   97   90   122   32 

10 input "frase "; frase$
20 input "minuscolo (1) o maiuscolo(2) "; d
30 frase2$=""
40 for c=1 to len(frase$) : a$ = mid$(frase$, c, 1)   ' carattere c-esimo di frase$
50   if d=2 and asc(a$) > 96 and asc(a$) < 123 then a$ = chr$(asc(a$)-32)
60   if d=1 and asc(a$) > 64 and asc(a$) < 91 then a$ = chr$(asc(a$)+32)
70   frase2$ = frase2$ + a$
80 next : print frase2$ : goto 10
frase  Chi sei? Babbo Natale? 
minuscolo (1) o maiuscolo(2)  1
chi sei? babbo natale?
frase  Chi sei? Babbo Natale?
minuscolo (1) o maiuscolo(2)  2
CHI SEI? BABBO NATALE?

05 ' INSTR(f1,f2) trova dove inizia la sottofrase f2 in f1
10 INPUT "Frase = "; frase$ : INPUT "sotto frase = "; frase1$
20 PRINT INSTR(frase$, frase1$)
30 GOTO 10

Frase =  Che bella giornata!
sotto frase = ella
6
Frase =  Che bella giornata!
sotto frase = essa
0

05 ' STR$ trasforma un numero in una stringa
10 INPUT x
20 PRINT x+x
30 PRINT STR$(x)+STR$(x)
40 GOTO 10

? 50
100
5050
? 4.5
9
4.54.5

10 INPUT "Frase = "; frase$
20 INPUT "Sottofrase dal posto iniziale "; j : INPUT "avanti di "; n
30 PRINT MID$(frase$, j, n)
40 GOTO 10

Frase =  Che bella giornata!
Sottofrase dal posto iniziale  5
avanti di  9
bella gio


10 text$ = "A" + STRING$(20, "1") + "B"
20 PRINT text$

A11111111111111111111B


Per il valore di π e di puoi usare i valori 3.1415926535897932 e 6.2831853071795865
10 GOSUB 1000
20 INPUT "gradi = "; gradi
30 PRINT "radianti = "; gradi/180*PI
40 GOTO 20
1000 PI = 3.1415926535897932 RETURN

gradi =  90
radianti = 1.5707963267948966
gradi =  360
radianti = 6.283185307179586
gradi =  45
radianti = 0.7853981633974483
gradi =  180
radianti = 3.141592653589793

10 GOSUB 1000
20 INPUT "gradi = "; gradi
30 PRINT "seno = "; SIN(gradi/180*PI)
40 PRINT "coseno = "; COS(gradi/180*PI)
50 PRINT "tangente = "; TAN(gradi/180*PI)
69 PRINT "Devi arrotondare con 2 cifre in meno i risultati"
70 GOTO 20
1000 PI = 3.1415926535897932 RETURN

gradi =  30
seno = 0.49999999999999994
coseno = 0.8660254037844387
tangente = 0.5773502691896257
Devi arrotondare con 2 cifre in meno i risultati



Dopo un comando di INPUT posso mettere più variabili. Un esempio:
10 ' area del poligono P1, P2, ...Pn
20 ' prova con (11,8),(3,13),(1,3),(7,8)
30 n = 4 : for i=1 to n : input "introduci x, poi introduci y "; x(i), y(i) : next
40 area = (y(n)+y(1))*(x(n)-x(1))
50 for i=1 to n-1 : area = area+(y(i)+y(i+1))*(x(i)-x(i+1)) : next
60 print "area = "; area/2
introduci x, poi introduci y  11 8
introduci x, poi introduci y  3 13
introduci x, poi introduci y  1 3
introduci x, poi introduci y  7 8
area = 35
    

 
Le relazioni di eguaglianza, di ordine, ... hanno il valore "true" o "false". Un esempio:
10 input "x = "; x : input "y = "; y
20 print "x < y, x > y, x = y, x >= y, x <= y"
30 print x < y, x > y, x = y, x >= y, x <= y
40 goto 10

x =  2
y =  3
x < y, x > y, x = y, x >= y, x <= y
true   false   false   false   true
x =  2
y =  2
x < y, x > y, x = y, x >= y, x <= y
false   false   true   true   true
x =  4.5
y =  3
x < y, x > y, x = y, x >= y, x <= y
false   true   false   true   false



10 input "nome 1 "; nome1$ : input "nome 2 "; nome2$
20 print "nome 1 < nome 2 ?    ";
30 print nome1$ < nome2$
40 goto 10

nome 1  paolo
nome 2  maria
nome 1 < nome 2 ?    false
nome 1  luigi
nome 2  sara
nome 1 < nome 2 ?    true
Invece delle uscite true e false (come quelle ottenute con la riga 20 del programma sottostante),  in alcuni casi si hanno 1 e 0 (come con le righe 25 e 30);  1 e 0 nei programmi si possono usare anche come "vero" e "falso" (vedi le righe 40 e 50).
10 A = 0>1 : B = 1>0
15 print "stampa di A e di B, stampa di  A or B, stampa di  A and B"
20 print A, B
25 print A or B
30 print A and B
40 V=1 : if V then print "vero" else print "falso"
50 V=0 : if V then print "vero" else print "falso"

stampa di A e di B, stampa di  A or B, stampa di  A and B
stampa di A e di B, stampa di  A or B, stampa di  A and B
false   true
1
0
vero
falso

10 print "A: x e' maggiore di 2 e x e' minore di 5"
20 print "B: x e' minore di 0 o x e' maggiore di 3"
30 input "x "; x
40 if x > 2 and x < 5 then print "A: vero  "; else print "A: falso  ";
50 if x < 0 or x > 3 then print "B: vero" else print "B: falso"
60 goto 30

A: x e' maggiore di 2 e x e' minore di 5
B: x e' minore di 0 o x e' maggiore di 3
x  3
A: vero  B: falso
x  1
A: falso  B: falso
x  -2
A: falso  B: vero


10 input "x = "; x : input "y = "; y
20 if (x>0 and y>0) or (x<0 and y<0) or (x=0 and y=0) then print "segno uguale" else print "segno diverso"
30 goto 10

x =  3
y =  2
segno uguale
x =  3
y =  -2
segno diverso
x =  0
y =  0
segno uguale

 
 

Altri ESEMPI

05 ' Calcolo senza tener conto delle priorita' tra le operazioni
10 INPUT "numero "; x : u$=STR$(x)
20 INPUT "operazione (+,-,*,/,^ o =) "; op$; : u$=u$+" "+op$ : op$=" "+op$+" "
25 ' Ho aggiunto spazi bianchi ai simboli di operazione
40 IF op$=" + " THEN goto 100
50 IF op$=" - " THEN goto 110
60 IF op$=" * " THEN goto 120
70 IF op$=" / " THEN goto 130
80 IF op$=" ^ " THEN goto 140
90 print "Calcolo a catena "+u$+"  "+ x : print "" : goto 10
100 INPUT "numero "; y : u$=u$+" "+STR$(y) : x=x+y : print x : goto 20
110 INPUT "numero "; y : u$=u$+" "+STR$(y) : x=x-y : print x : goto 20
120 INPUT "numero "; y : u$=u$+" "+STR$(y) : x=x*y : print x : goto 20
130 INPUT "numero "; y : u$=u$+" "+STR$(y) : x=x/y : print x : goto 20
140 INPUT "numero "; y : u$=u$+" "+STR$(y) : x=x^y : print x : goto 20

numero  20
operazione (+,-,*,/,^ o =)  *
numero  5
100
operazione (+,-,*,/,^ o =)  /
numero  40
2.5
operazione (+,-,*,/,^ o =)  +
numero  11.5
14
operazione (+,-,*,/,^ o =)  ^
numero  2
196
operazione (+,-,*,/,^ o =)  =
Calcolo a catena 20 * 5 / 40 + 11.5 ^ 2 =  196

Invece il calcolo usuale (che tiene conto delle priorità) di  20 * 5 / 40 + 11.5 ^ 2 -
che  equivale a  ( (20 * 5) / 40 ) + (11.5 ^ 2)  - avrebbe dato:
10 PRINT 20 * 5 / 40 + 11.5 ^ 2
134.75 
A differenza di altre applicazioni questa versione del Basic non dà priorità a "^" rispetto a "*";  conviene mettere sempre le parentesi in questi casi:
10 print "2*3^2 = " 2*3^2; ", 2*(3^2) = "; 2*(3^2)
2*3^2 = 36, 2*(3^2) = 18
-----------------------------------------------
05 ' Istogramma avente per colonne i 5 dati 127,585,430,1256,148
06 ' Posso modificare lung per avere istogrammi di divesa lunghezza
10 lung=80 : n=5
15 dim dati(n-1)
25 dati(0)=127 : dati(1)=585 : dati(2)=430: dati(3)=1256 : dati(4)=148
30 max=0 : totale = 0
35 for i=0 to n-1 : totale = totale+dati(i) : next
40 for i=0 to n-1
45 p = INT(dati(i)/totale*lung+0.5)
50 s="|" : for k=1 to p : s=s+"#" : next
55 print s + " " + dati(i)
60 next

|#### 127
|################## 585
|############## 430
|####################################### 1256
|##### 148

05 ' Istogramma avente per colonne i 5 dati 127,585,430,1256,148
06 ' Posso modificare lung per avere istogrammi di divesa lunghezza
10 lung=150 : n=5
15 dim dati(n-1)
25 dati(0)=127 : dati(1)=585 : dati(2)=430: dati(3)=1256 : dati(4)=148
30 max=0 : totale = 0
35 for i=0 to n-1 : totale = totale+dati(i) : next
40 for i=0 to n-1
45 p = INT(dati(i)/totale*lung+0.5)
50 s="|" : for k=1 to p : s=s+"#" : next
55 print s + " " + dati(i)
60 next

|####### 127
|################################## 585
|######################### 430
|########################################################################## 1256
|######### 148

05 'ISTOGRAMMA morti nel 2006 per eta' negli intervalli delimitati da 0, 5, 10,..., 105, 110
10 lung = 400 : n = 22 : DIM x(n-1)
15 DATA 43,5,6,16,23,26,28,37,56,88,141,225,350,518,814,1245,1771,2027,1643,727,195,17
20 for i=0 to n-1: READ x(i) : next
25 tot = 0 : for i=0 to n-1 : totale = totale+x(i) : next
30 for i=0 to n-1
35 p = INT(x(i)/totale*lung+0.5)
40 s="|" : for k=1 to p : s=s+"#" : next
45 print s + " " + x(i)
50 next

|## 43
| 5
| 6
|# 16
|# 23
|# 26
|# 28
|# 37
|## 56
|#### 88
|###### 141
|######### 225
|############## 350
|##################### 518
|################################# 814
|################################################## 1245
|####################################################################### 1771
|################################################################################# 2027
|################################################################## 1643
|############################# 727
|######## 195
|# 17

Con lo script isto/diagramma:
-----------------------------------------------
05 ' mettiamo in ordine i seguenti (24) numeri
10 DATA 43, 5, 36, 16, 23,126, 28, 37, 56,88
15 DATA 141,225,350,518, 7,643,727,195,17, 8
20 DATA 1210, 83, 409, 345
25 n = 24 : dim x(n-1) : for i=0 to n-1: READ x(i) : next
30 for i=0 to n-1 : print x(i)+" "; : next : print ""
35 ' man mano se trovo un numero piu' piccolo lo metto in testa
40 for i=0 to n-1 : for j=i to n-1
45     if x(j) < x(i) then gosub 100
50 next : next
55 for i=0 to n-1 : print x(i)+" "; : next
60 end
100 c=x(i) : x(i)=x(j) : x(j)=c : return
110 ' ho scambiato x(i) e x(j)

43 5 36 16 23 126 28 37 56 88 141 225 350 518 7 643 727 195 17 8 1210 83 409 345 
5 7 8 16 17 23 28 36 37 43 56 83 88 126 141 195 225 345 350 409 518 643 727 1210 

-----------------------------------------------
10 ' Trucco per contare i dati: metto un dato "strano", ad es. 13579, alla fine
20 DATA 43,5,6,16,49,26,28,37,56,88,141,225,330,3,32,78,89,123,73,24,12,7,245
21 DATA 13579
30 n=0 : ok=1 : while ok=1 : read x : if x=13579 then ok=0 else n=n+1 : wend
40 print n      ' ho contato i dati; sono n
23

10 n=23 : dim dat(n)
20 data 43,5,6,16,49,26,28,37,56,88,141,225,330,3,32,78,89,123,73,24,12,7,245
30 for i=1 to n : read dat(i) : next
40 min=dat(1) : max=dat(1) : sum=0
50 for i=1 to n : sum=sum+dat(i)
60   if dat(i) < min then min = dat(i)
65   if dat(i) > max then max = dat(i)
70 next : print "min = "; min; "  max = "; max; "  media = "; sum/n
min = 3  max = 330  media = 75.47826086956522
-----------------------------------------------
10 print "soluzioni di a*x^2 + b*x + c = 0"
20 input "a = "; A : input "b = "; B : input "c = "; C
30 abc = B*B-4*A*C : if abc<0 then goto 100
40 if abc=0 then goto 200
50 k1 = -B/(A+A)+SQR(abc)/(2*A): k2 = -B/(A+A)-SQR(abc)/(2*A)
60 print "soluzioni:  "; k1, k2 : goto 20
100 print "b^2-4*a*c = "; abc; " < 0. Nessuna soluzione." : goto 20
200 print "b^2-4*a*c = 0; 1 soluzione:  "; -B/(A+A) : goto 20

soluzioni di a*x^2 + b*x + c = 0
a =  2
b =  -1
c =  -1
soluzioni:  1   -0.5
a =  2
b =  -1
c =  0.125
b^2-4*a*c = 0; 1 soluzione:  0.25
a =  2
b =  -1
c =  1
b^2-4*a*c = -7 < 0. Nessuna soluzione.

Lo script equazioni risolve in modo simile altre equazioni: vedi la figura seguente  (equazioni più complesse sono risolubili con WolframAlpha).

-----------------------------------------------
05 PRINT "introduco P1,P2,P3,... e ho via la distanza P1P2, P1P2P3, ..."
10 L = 0 : INPUT "x = "; x1 : INPUT "y = "; y1
20 INPUT "x = "; x2 : INPUT "y = "; y2
30 L = L + SQR((x2-x1)^2+(y2-y1)^2)
40 PRINT "lunghezza = "; L; :  INPUT "  Continuo ? (s/n) "; r$
50 IF r$="s" THEN GOTO 60 ELSE GOTO 5
60 x1=x2 : y1=y2 : GOTO 20
introduco P1,P2,P3,...; via via ho P1P2, P1P2P3, ...
x =  -1.5
y =  0
x =  0
y =  -2
lunghezza = 2.5  Continuo ? (s/n)  s
x =  1.5
y =  0
lunghezza = 5  Continuo ? (s/n)  s
x =  0
y =  2
lunghezza = 7.5  Continuo ? (s/n)  s
x =  -1.5
y =  0
lunghezza = 10  Continuo ? (s/n)  n

-----------------------------------------------
05 ' Lancio una moneta equilibrata 200 volte.
06 ' Qual e' la probabilita' di ottenere 100 testa?
07 ' Provo 10 mila, 20 mila e 30 mila volte
10  n=10^4 : x=0 : for i=0 to n
15    testa=0 : for j=0 to 200
20      if RND>0.5 then testa = testa+1
25    next
30    if testa=100 then x=x+1
35  next : print x/n*100
40  for i=0 to n
45    testa=0 : for j=0 to 200
50      if RND>0.5 then testa = testa+1
55    next
60    if testa=100 then x=x+1
65  next : print x/(n+n)*100
70  for i=0 to n
75    testa=0 : for j=0 to 200
80      if RND>0.5 then testa = testa+1
85    next
90    if testa=100 then x=x+1
95  next : print x/(n+n+n)*100

5.88
5.86
5.576666666666666
La probabilità è circa del 5.6%
-----------------------------------------------
Dove si incontrano la curva y = 2x e la curva y = -2x+1.5 ?


Capito dal grafico (fatto con WolframAlpha) che si incontrano tra 0 ed 1, posso usare questo semplice programmino [eventualmente introcudendo la riga   45 print m, "n="; n; : input " batti 'a capo' "; h$ ]
     
10 print "soluzione di 2^x-(-2*x+1.5) = 0 tra 0 ed 1"
15 a = 0 : b = 1
20 n = 0
25 m = a+(b-a)/2
30 n=n+1 : x = a : gosub 1000 : gosub 500 : sa = segno
35 x = m : gosub 1000 : gosub 500 : sm = segno
40 if sa = sm then a = m else b = m
50 goto 25
500 segno=0 : if y>0 then segno = 1 
501 if y<0 then segno = -1
502 if segno=0 or n = 60 then gosub 600
503 return
600 print "x = "; m : print "- - - - - - - - - - - -" : END
1000 y = 2^x-(-2*x+1.5) : return

soluzione di 2^x-(-2*x+1.5) = 0 tra 0 ed 1
x = 0.1825542858240715
- - - - - - - - - - - -
Con la riga 45 avrei anche le uscite:
soluzione di 2^x-(-2*x+1.5) = 0 tra 0 ed 1
0.5   n=1 batti 'a capo'  
0.25   n=2 batti 'a capo'  
0.125   n=3 batti 'a capo'  
0.1875   n=4 batti 'a capo'
...
0.18255428582407152   n=53 batti 'a capo'  
0.18255428582407146   n=54 batti 'a capo'  
x = 0.1825542858240715

Il metodo visto, utilizzato per risolvere l'equazione f(x)=0 in un intervallo [a,b] ai cui estremi f abbia valori di segno opposto, si chiama "bisezione".
Si procede calcolando il valore di f nel centro di [a,b],  restringendosi al mezzo intervallo nei cui estremi f ha valori di segno opposto;  a sua volta si calcola il valore di f al centro di questo nuovo intervallo e ci si restringe alla metà di esso nei cui estremi f ha segni opposti;  e così via.

   

-----------------------------------------------
Vediamo con un esempio come si possono realizzare programmi più complessi.  Questo esempio ci consente di capire pure come mettere a punto un programma può essere utile anche per capire l'oggetto matematico (qui l'integrale) a cui è riferito il calcolo.
10 a = -1 : b = 1 : d = b-a
20 n=4 : gosub 400 : print "n = "; n ; "  integrale = "; I
30 n=n*2: gosub 400: print "n = "; n ; "  integrale = "; I
40 n=n*2: gosub 400: print "n = "; n ; "  integrale = "; I
50 n=n*2: gosub 400: print "n = "; n ; "  integrale = "; I
60 n=n*2: gosub 400: print "n = "; n ; "  integrale = "; I
100 end
400 h=d/n: s=0: for j=1 to n: x=a+(j-1/2)*h: gosub 500: s=s+y: next: I=s*h: return
500 y = sqr(1-x^2) : return
n = 4  integrale = 1.629683664318002
n = 8  integrale = 1.5919646103059533
n = 16  integrale = 1.5783434656491544
n = 32  integrale = 1.5734759039632609
n = 64  integrale = 1.571745701341119
    
L'animazione a fianco illustra il procedimento nel caso in cui la funzione F da integrare nell'intervallo [-1,1] sia x → √(1-x²):  l'integrale viene approssimato con quello della funzione a scalini ottenuta dividendo l'intervallo in n intervallini uguali e che ha in ciascuno di essi il valore che F ha nel suo centro.

Posso aumentare n (partendo da un numero a 4 cifre) ed aggiungere la stampa della variazione tra una approssimazione e la successiva per rendermi conto della velocità con cui ci si avvicina al risultato "esatto":
10 a = -1 : b = 1 : d = b-a
20 n=4321 : gosub 400 : print "n = "; n ; " integrale = "; I
30 I0=I: n=n*2: gosub 400: print "n = "; n ; "  integrale = "; I; "  variaz.= ";I-I0
40 I0=I: n=n*2: gosub 400: print "n = "; n ; "  integrale = "; I; "  variaz.= ";I-I0
50 I0=I: n=n*2: gosub 400: print "n = "; n ; "  integrale = "; I; "  variaz.= ";I-I0
60 I0=I: n=n*2: gosub 400: print "n = "; n ; "  integrale = "; I; "  variaz.= ";I-I0
70 I0=I: n=n*2: gosub 400: print "n = "; n ; "  integrale = "; I; "  variaz.= ";I-I0
80 I0=I: n=n*2: gosub 400: print "n = "; n ; "  integrale = "; I; "  variaz.= ";I-I0
100 end
400 h=d/n: s=0: for j=1 to n: x=a+(j-1/2)*h: gosub 500: s=s+y: next: I=s*h: return
500 y = sqr(1-x^2) : return

n = 4321 integrale = 1.5707980416799694
n = 8642  integrale = 1.5707969331078167  variaz.= -0.000001108572152741516
n = 17284  integrale = 1.570796541160566  variaz.= -3.919472506552779e-7
n = 34568  integrale = 1.570796402584901  variaz.= -1.385756649430192e-7
n = 69136  integrale = 1.5707963535907532  variaz.= -4.8994147849867886e-8
n = 138272  integrale = 1.5707963362686501  variaz.= -1.732210308524884e-8
n = 276544  integrale = 1.570796330144368  variaz.= -6.12428219248784e-9
Le variazioni successive sono circa un terzo della precedente. Quindi possiamo prevedere che il valore scenderà di 1/3 + 1/3/3 + ... ossia di circa 0.44 volte l'ultima variazione ossia di circa -3e-9. Posso prendere 1.570796330-0.000000003 = 1.570796327.  Con WolframAlpha posso controllare che questa è un'approssimazione di π/2.
Potrei procedere con n maggiori ma mi conviene fermarmi per evitare eventuali errori di arrotondamento: in tutti i problemi concreti servono meno di 10 cifre.
    
Un altro esempio:
10 a = 0 : b = 3 : d = b-a
...
500 y = ABS(x*(x-2)) : return
n = 4321 integrale = 2.666666599728399
n = 8642  integrale = 2.6666666499282217  variaz.= 5.0199822521079795e-8
n = 17284  integrale = 2.666666662482534  variaz.= 1.255431225644088e-8
n = 34568  integrale = 2.6666666656205797  variaz.= 3.138045823192215e-9
n = 69136  integrale = 2.6666666664051637  variaz.= 7.845839533615617e-10
n = 138272  integrale = 2.6666666666012984  variaz.= 1.9613466406553925e-10
n = 276544  integrale = 2.6666666666503493  variaz.= 4.9050985495568966e-11
L'integrale di |x·(x-2)| tra 0 e 3 è 2.666... = 8/3
Per il grafico posso ricorrere facilmente a WolframAlpha,  con
plot y = abs(x*(x-2)), 0 < x < 3   o
plot y = |x*(x-2)|, 0 < x < 3
     

-----------------------------------------------
      Analogamente si può calcolare la derivata di una funzione F in un punto Q:  basta calcolare la pendenza della retta passante tra il punto del grafico di F di ascissa Q-h e quello di ascissa Q+h per valori di h che tendono a 0.  Vedi la figura a fianco.

Troviamo ad esempio la derivata di  F: x → (1+x^2)/(1+x^3)  in Q = 2:
10 Q = 2 : h = 0.01
20 for i=1 to 10
30 gosub 200 : print D : h=h/2
40 next
90 end
100 y = (1+x^2)/(1+x^3): return
200 x=Q-h : gosub 100 : y1=y : x=Q+h : gosub 100 : y2=y : D = (y2-y1)/(2*h) : return
-0.2963008229309505
-0.2962974279763775
-0.2962965792176364
-0.29629636702681594
-0.2962963139788499
-0.29629630071692503
-0.29629629740171026
-0.2962962965725069
-0.2962962963636073
-0.2962962963096061
      Potrei aumentare il numero delle uscite, ma devo stare attento a quando incominciano gli errori di arrotodamento.  Se avessi messo "for i=1 to 16" avrei ottenuto anche le uscite seguenti, ma mi sarei subito reso conto che l'ultima non seguiva l'andamento delle altre:
            -0.29629629630107956
            -0.29629629631244825
            -0.29629629630107956
            -0.29629629625560483
            -0.29629629625560483
            -0.29629629643750377
 
Posso dunque prendere l'arrotondamento -0.2962962963.  Volendo, posso utilizzare WolframAlpha per capire che il valore esatto sarebbe -8/27.
     
-----------------------------------------------
Spesso è comodo cercare, ad esempio, minimo e massimo di una funzione procedendo con una ricerca "a caso". Un esempio:
05 ' min e max della funzione definita in 1000
10 a = -1 : b = 2 : h=b-a
15 x=a : gosub 1000 : fa=y : x=b : gosub 1000 : fb=y
20 min = fa : max = fb : x1=a : x2=b
25 if fa > fb then min = fb : max = fa : x1=b : x2=a
30 for i=1 to 10^6 : x = RND*h+a : gosub 1000
35   if y < min then gosub 1001
40   if y > max then gosub 1002
45 next
50 print "min="+min+" x="+xmin: print "max="+max+" x="+xmax : END
1000 y = 9*sin(x-1)-x^3 : return
1001 min=y : xmin=x : x1=x : return
1002 max=y : xmax=x : x2=x : return

min=-8.852992318037892 x=-0.490509569644928
max=0.9879560565027785 x=1.582704246044159
   ripeto
min=-8.852992318038371 x=-0.4905104637145996
max=0.9879560564804764 x=1.5827046036720276
   cambio  a = -0.6 : b = -0.4
min=-8.852992318039329 x=-0.490510094165802
min=-8.852992318039334 x=-0.4905100703239441
   cambio  a = 1.5 : b = 1.6
max=0.9879560566264289 x=1.5827001154422762
max=0.9879560566264276 x=1.582700127363205
   Concludendo tra -1 e 2  9*sin(x-1)-x^3  ha:
min = -8.852992318 in -0.4905101
max = 0.9879560566264 in 1.5827001
Con WolframAlpha:
-----------------------------------------------
05 ' I primi numeri di Armstrong: numeri di k cifre uguali alla somma delle cifre elevata alla k
10 n=1 : for a=1 to 9
15 if a=a^n then print a;" ";
20 next
25 n=2 : for a=1 to 9 : for b=0 to 9
30 if a*10+b = a^n+b^n then print a;b;" ";
35 next : next
40 n=3 : for a=1 to 9 : for b=0 to 9 : for c=0 to 9
45 if a*100+b*10+c = a^n+b^n+c^n then print a;b;c;" ";
50 next : next : next
55 n=4: for a=1 to 9: for b=0 to 9: for c=0 to 9: for d=0 to 9
60 if a*1000+b*100+c*10+d = a^n+b^n+c^n+d^n then print a;b;c;d;" ";
65 next : next : next : next
70 n=5: for a=1 to 9: for b=0 to 9: for c=0 to 9: for d=0 to 9: for e=0 to 9
75 if a*10000+b*1000+c*100+d*10+e = a^n+b^n+c^n+d^n+e^n then print a;b;c;d;e;" ";
80 next : next : next : next : next

1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 54748 92727 93084
Ad esempio 407 = 4^3+0^3+7^3 = 64+49*7 = 64+343
-----------------------------------------------
10 for n=0 to 10
20 x = 1/(2^n) : gosub 100 : print "y(" + x + ") = "+ y
30 next
40 end
100 y = (sin(x)-x)/(x^3) : return

y(1) = -0.1585290151921035
y(0.5) = -0.16459569116637596
y(0.25) = -0.16614660771053202
y(0.125) = -0.16653650676342124
y(0.0625) = -0.16663411761069824
y(0.03125) = -0.16665852883500065
y(0.015625) = -0.16666463217325145
y(0.0078125) = -0.16666615804024332
y(0.00390625) = -0.16666653950960608
y(0.001953125) = -0.16666663487558253
y(0.0009765625) = -0.16666665871161968
Il limite di (sin(x)-x)/(x^3) per x -> 0 è -1/6
10 for n=6 to 16
20 x = 10^n : gosub 100 : print "y("+ x + ") = " + y
30 next
40 end
100 y = (1+x)^(1/5)-x^(1/5) : return

y(1000000) = 0.0000031697851170520153
y(10000000) = 5.023772651213676e-7
y(100000000) = 7.96214294496167e-8
y(1000000000) = 1.261914661654373e-8
y(10000000000) = 1.9999930600533844e-9
y(100000000000) = 3.169873252772959e-10
y(1000000000000) = 5.0249582272954285e-11
y(10000000000000) = 7.958078640513122e-12
y(100000000000000) = 1.2505552149377763e-12
y(1000000000000000) = 2.2737367544323206e-13
y(10000000000000000) = 0
Il limite di 5√(1+x)- 5√x  per x ->  è 0
-----------------------------------------------
10 PI = 3.1415926535897932
20 input "gradi = "; gradi
30 PRINT "pendenza = "; TAN(gradi/180*PI)*100+"%"
40 GOTO 20

gradi =  10
pendenza = 17.632698070846498%
gradi =  30
pendenza = 57.735026918962575%
gradi =  89.99
pendenza = 572957.7893128936%
Con lo script calcoli:
-----------------------------------------------
10 print "Numeri primi <= N (Introduci N < 8000 per non attendere troppo)"
20 input "N = "; n : print 1+" "; : posti=1
30 for m = 2 to n
40 '  m e' primo se la divisione per ogni k < m non e' esatta
50     k=2 : OK=1
60     while OK=1
70       OK=-1 : if k < m then OK=OK+1
90       if m/k <> INT(m/k) then OK=OK+1
100      IF OK = 1 then k=k+1
110   wend
120   if k = m then GOSUB 200  ' m e' primo
130   if posti=25 then GOSUB 210
140 next
150 print "" : goto 20
200 posti = posti+1 : print k+" "; : return
210 print "" : posti=1 : return

Numeri primi <= N (Introduci N < 8000 per non attendere troppo)
N =  500
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 
97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 
227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 
367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 
-----------------------------------------------
10 print "Divisori primi di N"
20 input "N = "; n
30 d=2 : v=1 : m=n : d1=1
40 while d <= m
50 if m/d = INT(m/d) then gosub 200 else d=d+1
60 wend
90 print v : goto 20
200 v=v+" "+d : m = m/d : d1 = d : return

N =  30
1 2 3 5
N =  1000
1 2 2 2 5 5 5
N =  12345
1 3 5 823
N =  123456789
1 3 3 3607 3803
-----------------------------------------------

Contiamo quanti sono i dati e poi facciamone la media
10 ' Contiamo i dati (altezze arrotondate ai cm di un gruppo di ragazzi)
20 data 168, 183, 186, 184, 176, 184, 184, 188, 184, 181, 188, 182, 178, 170
21 data 180, 184, 175, 186, 188, 167, 179, 178, 178, 189, 189, 181, 175, 178
22 data 183, 170, 176, 184, 186, 181, 173, 176, 185, 190, 167, 175, 167, 185
23 data 173, 189, 187, 177, 170, 183, 189, 172, 175, 180, 181, 184, 174, 170
24 data 172
25 data 13579      ' metto un dato "strano", ad es. 13579, alla fine
30 n=0 : ok=1 : while ok=1 : read x : if x=13579 then ok=0 else n=n+1 : wend
40 print n      ' ho contato i dati; sono n

57
10 ' Calcoliamo l'altezza media
20 data 168, 183, 186, 184, 176, 184, 184, 188, 184, 181, 188, 182, 178, 170
21 data 180, 184, 175, 186, 188, 167, 179, 178, 178, 189, 189, 181, 175, 178
22 data 183, 170, 176, 184, 186, 181, 173, 176, 185, 190, 167, 175, 167, 185
23 data 173, 189, 187, 177, 170, 183, 189, 172, 175, 180, 181, 184, 174, 170
24 data 172
30 n=57: somma=0 : for i=1 to n : read x : somma=somma+x : next
40 m = somma/n : print "l'alezza media e' "; m
50 print "arrotondando ai millimetri: "; INT(m*10+1/2)/10

l'alezza media e' 179.59649122807016
arrotondando ai millimetri: 179.6

Questo esempio da un'idea di come un programma statistico (come lo script "calcolatrice") possa contare quanti sono i dati introdotti:


 
-----------------------------------------------

10 input "numero intero positivo "; N    ' lo trasformo in base DUE
15 ' cifra delle unita' = resto della divisione intera per 2, D = risultato intero 
20 D = INT(N/2) : R = N-D*2 : U = R : L=1 : D1=D
25 ' cifre successive = resto della divisione del nuovo D per 2
30 WHILE  L> 0
40    D=INT(D1/2) : R = D1-D*2 : U=R+" "+U : L=D : D1=D
50 WEND
60 IF N=0 THEN U=0
70 IF N=1 THEN U=1
80 PRINT N+" in base DUE : "+U : GOTO 10

numero intero positivo  4
4 in base DUE : 1 0 0
numero intero positivo  5
5 in base DUE : 1 0 1
numero intero positivo  64
64 in base DUE : 1 0 0 0 0 0 0
numero intero positivo  67
67 in base DUE : 1 0 0 0 0 1 1
numero intero positivo  123456789
123456789 in base DUE : 1 1 1 0 1 0 1 1 0 1 1 1 1 0 0 1 1 0 1 0 0 0 1 0 1 0 1
-----------------------------------------------

Simulazione del lancio di 1, 2, 3 o N dadi.
10 input "quanti dadi lancio? "; N
20 s=0 : for i=1 to N : x=int(rnd*6+1) : print x+" "; : s=s+x : next
30 if N>1 then print " somma = "; s else print
40 goto 10

quanti dadi lancio?  1
3 
quanti dadi lancio?  2
3 4  somma = 7
quanti dadi lancio?  2
5 5  somma = 10
quanti dadi lancio?  3
4 4 1  somma = 9
quanti dadi lancio?  3
4 6 3  somma = 13
-----------------------------------------------

Per avere un'idea di come si possono impostare algoritmi per i calcoli con vettori e matrici (come quelli svolgibili automaticamente con WolframAlpha) vediamo la somma e il prodotto di due matrici 2×2:
10 dim x(2,2) : dim y(2,2) : dim z(2,2) : dim w(2,2)
20 for i=1 to 2 : for j=1 to 2 : print "x("; i; "," ; j; ")= "; : input x(i,j): next : next
30 for i=1 to 2 : for j=1 to 2 : print "y("; i; "," ; j; ")= "; : input y(i,j): next : next
40 print "x =" : for i=1 to 2 : for j=1 to 2 : print x(i,j);"   "; : next : print : next
50 print "y =" : for i=1 to 2 : for j=1 to 2 : print y(i,j);"   ";: next : print : next
60 for i=1 to 2 : for j=1 to 2 : z(i,j)=x(i,j)+y(i,j): next : next
70 for i=1 to 2 : for j=1 to 2
80  w(i,j)=0: for k=1 to 2: w(i,j)=w(i,j)+x(i,k)*y(k,j): next
90 next : next
100 print "x+y =" : for i=1 to 2 : for j=1 to 2 : print z(i,j);"   "; : next : print : next
110 print "x*y =" : for i=1 to 2 : for j=1 to 2 : print w(i,j);"   "; : next : print : next
120 goto 20
x(1,1)= ? 2
x(1,2)= ? 3
x(2,1)= ? -4
x(2,2)= ? 1
y(1,1)= ? 2
y(1,2)= ? -3
y(2,1)= ? 5
y(2,2)= ? -2
x =
2   3   
-4   1   
y =
2   -3   
5   -2   
x+y =
4   0   
1   -1   
x*y =
19   -12   
-3   10
-----------------------------------------------

Come accade per tutti i linguaggi di programmazione, scrivendo lo stesso termine in modi diversi si possono ottenere risultati più o meno precisi.  Un esempio, in cui la formualazione di un termine che, ad una osservazione superficiale, appare più brutta è, in realtà, la più precisa.
1/(√(x2+1)+x)   e   √(x2+1)-x
10 for i=0 to 8 : x = 10^i
15 print "x = "; x
20 print "   1/(sqr(x^2+1)+x) = "; 1/(sqr(x^2+1)+x)
25 print "       sqr(x^2+1)-x = "; sqr(x^2+1)-x
30 next

x = 1
   1/(sqr(x^2+1)+x) = 0.4142135623730951
       sqr(x^2+1)-x = 0.41421356237309515
x = 10
   1/(sqr(x^2+1)+x) = 0.04987562112089027
       sqr(x^2+1)-x = 0.049875621120889946
...
x = 1000000
   1/(sqr(x^2+1)+x) = 4.999999999998749e-7
       sqr(x^2+1)-x = 5.00003807246685e-7
x = 10000000
   1/(sqr(x^2+1)+x) = 4.999999999999987e-8
       sqr(x^2+1)-x = 5.029141902923584e-8
x = 100000000
   1/(sqr(x^2+1)+x) = 5e-9
       sqr(x^2+1)-x = 0

La seconda presenta la differenza tra due termini - √(x2+1) e x - che al crescere di x tendono ad assumere valori sempre più vicini per cui si ottengono risultati man mano meno precisi.
Il calcolo "esatto" (per x = 100000000) con WolframAlpha:

1/(sqrt(100000000^2+1)+100000000) = 4.99999999999999987500000000000000624999999999999960937500000...× 10^-9
-----------------------------------------------

Come misurare la lunghezza di una curva?
Consideriamo ad esempio la lughezza della curva raffigurata a fianco.  È il grafico di una funzione, ma potrebbe trattarsi di una curva descritta come x=f(t), y=g(t) per t che varia in un intervallo [a,b].
L'idea è semplice:  suddividere l'intervallo [a,b] in tanti intervallini [a,t1], [t1,t2], ..., [tn,b] e calcolare la lunghezza della poligonale che congiunge punti in cui t vale a, t1, t2, ..., tn, b.
Facendo crescere il numero degli intervallini approssimiamo man mano meglio la lunghezza della curva.
Ecco sotto il programmino che calcola la lunghezza della curva a fianco.
     
10 a=-2 : b=2 : L1=0
20 input "numero passi: "; n : e = (b-a)/n : L=0
30 for i=1 to n : t1=a+(i-1)*e : t2=a+i*e
40  t=t1 : gosub 100 : x1=x : y1=y : t=t2 : gosub 100 : x2=x : y2=y
50  L = L+sqr((x1-x2)^2+(y1-y2)^2) : next
60 print L : goto 20
100 x = t : y = t^3-2*t : return

numero passi:  4
13.026466151931759
numero passi:  5000
13.501661154274576
numero passi:  10000
13.501661528734912
numero passi:  20000
13.501661622350092
Posso tranquillamente prendere 13.501662 come approssimazione della lunghezza.
Modificando leggermente il programma possiamo ottenere valutazioni più precise:
10 a=-2 : b=2 : L1=0
20 input "numero passi: "; n : e = (b-a)/n : L=0
30 for i=1 to n : t1=a+(i-1)*e : t2=a+i*e
40  t=t1 : gosub 100 : x1=x : y1=y : t=t2 : gosub 100 : x2=x : y2=y
50  L = L+sqr((x1-x2)^2+(y1-y2)^2) : next
60 print L;"    variazione = "; L-L1 : L1=L : goto 20
100 x = t : y = t^3-2*t : return

numero passi:  50000
13.501661648562154    variazione = 13.501661648562154
numero passi:  100000
13.501661652306938    variazione = 3.744784038417492e-9
numero passi:  200000
13.501661653242754    variazione = 9.358167574191611e-10
numero passi:  400000
13.501661653477074    variazione = 2.3431923068528704e-10
numero passi:  800000
13.501661653535493    variazione = 5.841904737735604e-11
numero passi:  1600000
13.501661653550164    variazione = 1.467093113660667e-11
numero passi:  3200000
13.50166165355453    variazione = 4.366285111245816e-12
La stampa delle variazioni mi fa capire come varia l'andamento delle uscite in questo caso:  ogni volta che raddoppio n la variazione si divide circa per 4, fino all'ultima delle uscite precedenti, quando diventano proponderanti gli errori di approssimazione.  Mi fermo e prendo come approssimazione della lunghezza 13.501661653555.
Posso verificare l'esito con WolframAlpha:  arc length of y=x^3-2*x from x=-2 to 2 → 13.501661653555066375809...