Types de données en Scilab
Scilab supporte plusieurs types de données fondamentaux : booléens, nombres complexes, entiers (plusieurs précisions), flottants double précision et chaînes de caractères. Comprendre ces types est essentiel pour éviter les erreurs de conversion et choisir la bonne représentation selon le contexte.
| Type | Exemple de création | Usage typique |
|---|
| Booléen | %t, %f | Tests logiques, masques |
| Complexe | 1 + 2*%i | Signal, algèbre complexe |
| Entier | int8(3), uint32(255) | Traitement d'image, données binaires |
| Flottant (défaut) | 3.14, 2e-5 | Calcul numérique général |
| Chaîne | "bonjour" | Affichage, étiquettes |
1. Booléens
Définition — Booléen Scilab Un booléen représente une valeur de vérité : vrai ou faux. Scilab utilise les constantes prédéfinies %t (ou %T) pour true et %f (ou %F) pour false. Les booléens résultent naturellement des opérateurs de comparaison et sont utilisés dans les conditions et les masques.
b = %t // true (ou %T)
b = %f // false (ou %F)
// Opérateurs logiques booléens
%t & %f // ET → %f
%t | %f // OU → %t
~%t // NON → %f
Exemple n°1 — Booléens et opérations logiques
etat = %t
disp(etat) // T
etat = %f
disp(etat) // F
// Comparaisons → booléens
disp(3 > 2) // T
disp(3 == 2) // F
// Booléen comme masque sur un vecteur
v = [1 5 3 8 2]
masque = (v > 3) // [F T F T F]
disp(masque)
disp(v(masque)) // éléments > 3 : [5. 8.]
T
F
T
F
masque = F T F T F
v(masque) = 5. 8.
| Opérateur | Description | Exemple | Résultat |
|---|
& | ET logique | %t & %f | F |
| | OU logique | %t | %f | T |
~ | NON logique | ~%t | F |
== | Égalité | 3 == 3 | T |
~= | Inégalité | 3 ~= 2 | T |
Astuce — Booléens dans les calculs arithmétiques En contexte arithmétique,
%t vaut
1 et
%f vaut
0. Cela permet de compter des occurrences sans boucle :
v = [4 1 7 2 9 3]
nb_sup_5 = sum(v > 5) // compte les éléments > 5 → 2
disp(nb_sup_5)
2. Nombres complexes
Définition — Nombre complexe Un nombre complexe z = a + b·i est stocké comme une paire de flottants double précision (partie réelle a, partie imaginaire b). La constante prédéfinie %i représente l'unité imaginaire i telle que i² = −1.
z = a + b * %i // création d'un complexe
real(z) // partie réelle
imag(z) // partie imaginaire
abs(z) // module |z| = sqrt(a²+b²)
conj(z) // conjugué ā - b·i
isreal(z) // %f si z a une partie imaginaire non nulle
| Fonction | Description | Exemple | Résultat |
|---|
real(z) | Partie réelle | real(3 + 4*%i) | 3. |
imag(z) | Partie imaginaire | imag(3 + 4*%i) | 4. |
abs(z) | Module | abs(3 + 4*%i) | 5. |
conj(z) | Conjugué | conj(3 + 4*%i) | 3 - 4i |
isreal(z) | Test si réel pur | isreal(3 + 4*%i) | F |
Exemple n°2 — Opérations sur les complexes
x = 1 + %i
y = 1 - %i
disp("x = " + string(x))
disp("isreal(x) = " + string(isreal(x))) // F
disp("real(y) = " + string(real(y))) // 1
disp("imag(y) = " + string(imag(y))) // -1
disp("abs(x) = " + string(abs(x))) // √2 ≈ 1.4142
disp("x * y = " + string(x * y)) // (1+i)(1-i) = 1+1 = 2
// Vérification : i² = -1
disp("%i^2 = " + string(%i^2)) // -1
x = 1 + i
isreal(x) = F
real(y) = 1.
imag(y) = -1.
abs(x) = 1.4142136
x * y = 2.
%i^2 = -1.
3. Entiers
Définition — Types entiers Scilab Scilab fournit 6 types entiers couvrant des précisions de 8 à 32 bits, en versions signée (plage [−2^(n−1), 2^(n−1)−1]) et non signée (plage [0, 2^n − 1]).
| Type | Bits | Signé | Plage de valeurs | Création |
|---|
int8 | 8 | ✅ Oui | [−128, 127] | int8(3) |
uint8 | 8 | ❌ Non | [0, 255] | uint8(200) |
int16 | 16 | ✅ Oui | [−32 768, 32 767] | int16(1000) |
uint16 | 16 | ❌ Non | [0, 65 535] | uint16(60000) |
int32 | 32 | ✅ Oui | [−2 147 483 648, 2 147 483 647] | int32(1000000) |
uint32 | 32 | ❌ Non | [0, 4 294 967 295] | uint32(4000000000) |
Fonctions de conversion et inspection
| Fonction | Description | inttype retourne |
|---|
int8(x) | Convertit en entier signé 8 bits | 1 |
int16(x) | Convertit en entier signé 16 bits | 2 |
int32(x) | Convertit en entier signé 32 bits | 4 |
uint8(x) | Convertit en entier non signé 8 bits | 11 |
uint16(x) | Convertit en entier non signé 16 bits | 12 |
uint32(x) | Convertit en entier non signé 32 bits | 14 |
inttype(x) | Retourne le code du type entier de x | — |
iconvert(x, t) | Convertit x vers le type de code t | — |
Exemple n°3 — Création et inspection de types entiers
a = int8(3)
b = uint8(3)
c = int32(3)
d = uint32(3)
disp("inttype(a) = " + string(inttype(a))) // 1 → int8
disp("inttype(b) = " + string(inttype(b))) // 11 → uint8
disp("inttype(c) = " + string(inttype(c))) // 4 → int32
disp("inttype(d) = " + string(inttype(d))) // 14 → uint32
inttype(a) = 1.
inttype(b) = 11.
inttype(c) = 4.
inttype(d) = 14.
Danger — Débordement silencieux (overflow) En Scilab, dépasser la plage d'un type entier provoque un
écrêtage silencieux(saturation) sans message d'erreur. Le résultat est tronqué à la valeur maximale :
x = int8(200) // ❌ dépasse [−128, 127]
disp(x) // → 127 (saturation à la valeur max)
y = uint8(-5) // ❌ négatif sur un type non signé
disp(y) // → 0 (saturation à la valeur min)
4. Virgules flottantes
Définition — Double précision Par défaut, tous les nombres en Scilab sont stockés en double précision IEEE 754 (64 bits). Cette représentation offre une précision relative de l'ordre de 10⁻¹⁶ et une plage allant jusqu'à ≈ 1.8 × 10³⁰⁸. C'est le type utilisé pour la quasi-totalité du calcul numérique.
| Caractéristique | Valeur |
|---|
| Stockage | 64 bits (double précision IEEE 754) |
| Précision relative | ≈ 10⁻¹⁶ (environ 15–16 chiffres significatifs) |
| Plus petit positif | %eps ≈ 2.22 × 10⁻¹⁶ |
| Plus grand nombre | %inf ≈ 1.8 × 10³⁰⁸ |
| Résultat indéfini | %nan (0/0, ∞−∞, …) |
Attention — Calcul flottant ≠ calcul exact Contrairement aux logiciels de calcul formel (Maple, Mathematica), Scilab effectue du calcul
numérique approché. Des erreurs d'arrondi de l'ordre de
%epssont inévitables. Ne jamais tester l'égalité stricte entre flottants :
// ❌ Comparaison stricte dangereuse
disp(0.1 + 0.2 == 0.3) // F (erreur d'arrondi !)
// ✅ Comparaison avec tolérance
disp(abs(0.1 + 0.2 - 0.3) < %eps) // T
5. Chaînes de caractères
Définition — Chaîne Scilab Une chaîne de caractères est une séquence de caractères délimitée par des guillemets doubles "...". L'opérateur + permet la concaténation de chaînes. La fonction string() convertit n'importe quelle valeur numérique en chaîne.
s = "bonjour" // création
s1 + s2 // concaténation
length(s) // longueur
string(valeur) // conversion numérique → chaîne
strsplit(s, sep) // découpage
strsubst(s, old, new) // remplacement
part(s, i:j) // extraction de sous-chaîne
| Fonction | Description | Exemple | Résultat |
|---|
s1 + s2 | Concaténation | "foo" + "bar" | "foobar" |
length(s) | Longueur | length("bonjour") | 7. |
string(x) | Nombre → chaîne | string(3.14) | "3.14" |
strsplit(s, sep) | Découpage | strsplit("a,b,c", ",") | ["a","b","c"] |
strsubst(s,old,new) | Remplacement | strsubst("hello","l","r") | "herro" |
part(s, i:j) | Sous-chaîne | part("scilab", 1:3) | "sci" |
Exemple n°4 — Opérations sur les chaînes
x = "foo"
y = "bar"
// Concaténation
disp(x + y) // foobar
// Longueur
disp(length("bonjour")) // 7
// Conversion nombre → chaîne pour affichage
n = 42
disp("La réponse est : " + string(n)) // La réponse est : 42
// Extraction d'une sous-chaîne (indices 1 à 3)
mot = "Scilab"
disp(part(mot, 1:3)) // Sci
// Remplacement
disp(strsubst("hello world", "world", "Scilab")) // hello Scilab
foobar
7
La réponse est : 42
Sci
hello Scilab
Astuce — Affichage formaté avec string() Combiner
string() et
+ permet de construire des messages d'affichage lisibles sans recourir à
printf:
a = 3
b = 4
hyp = sqrt(a^2 + b^2)
disp("Hypoténuse de (" + string(a) + ", " + string(b) + ") = " + string(hyp))
// → Hypoténuse de (3, 4) = 5.
Récapitulatif — Types de données
| Type | Constantes/Création | Fonctions clés | Piège principal |
|---|
| Booléen | %t, %f | & | ~ | Vaut 1/0 en arithmétique |
| Complexe | a + b*%i | real, imag, abs, conj | isreal → %f même si imag = 0 |
| Entier signé | int8/16/32 | inttype, iconvert | Saturation silencieuse si overflow |
| Entier non signé | uint8/16/32 | inttype, iconvert | Valeurs négatives → 0 |
| Flottant | 3.14, 2e-5 | %eps, %inf, %nan | Ne jamais tester == entre flottants |
| Chaîne | "texte" | +, string, length, part | + concatène, ne convertit pas les nombres |
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.