{ "cells": [ { "cell_type": "markdown", "id": "657ee43e-abd8-4efe-b5e0-6a632114529a", "metadata": {}, "source": [ "# Cours ENPC - Pratique du calcul scientifique" ] }, { "cell_type": "markdown", "id": "a30eaeba", "metadata": {}, "source": [ "## Calcul en virgule flottante" ] }, { "cell_type": "markdown", "id": "9bf180c2", "metadata": {}, "source": [ "### Exemples de motivation\n", "Afficher les calculs de la présentation du cours `0.1 + 0.2 == 0.3` etc... \n", "Pour afficher un résultat, plusieurs commandes sont possibles : `print`, `println`, `display` et `@show`. \n", "On rappelle que l'aide sur une commande est accessible depuis le REPL en tapant d'abord `?` puis la commande. Si la commande appartient à une bibliothèque non standard, il faut au préalable charger la bibliothèque par `using` ou `import`." ] }, { "cell_type": "code", "execution_count": 17, "id": "f844286e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "67de04c0", "metadata": {}, "source": [ "### Exercice\n", "1. Construire une fonction renvoyant le signe, l'exposant et la mantisse en s'arrêtant à `n` bits après la virgule\n", "1. Appliquer à `x = 1/BigFloat(10)` en tronquant la mantisse à 52 bits après la virgule\n", "1. Expliquer ce que renvoie `bitstring(0.1)[13:end]` et la raison du `13`\n", "1. Comparer" ] }, { "cell_type": "code", "execution_count": null, "id": "a01dcf02-db49-491e-a799-dda5e44f34fc", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b318c712", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "5dc88012", "metadata": {}, "source": [ "### Exercice\n", "1. Implémenter l’algorithme décimal → binaire pour des entiers $n∈\\mathbb{N}$\n", "1. Appliquer à quelques entiers et vérifier le résultat avec `bitstring`" ] }, { "cell_type": "code", "execution_count": null, "id": "0eb6815d-1062-49e9-864e-d0f7233d55b6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "0a7f488b-c76f-47ca-9de1-f21e56c2cc31", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "f5eff406", "metadata": {}, "source": [ "### Exemples d'opérations sur les flottants" ] }, { "cell_type": "code", "execution_count": null, "id": "01df76eb", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "61e3b3a8", "metadata": {}, "source": [ "### Exercice\n", "Expliquer par analyse des exposants et mantisses pourquoi $0.1 \\widehat + 0.2≠0.3$ dans `Float16`" ] }, { "cell_type": "code", "execution_count": null, "id": "7f939086", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "1b702554", "metadata": {}, "source": [ "### Exemples sur les entiers\n", "Afficher `bitstring(1)`, `bitstring(-1)`, `2^63`, `-2^63-1` et `2^64`" ] }, { "cell_type": "code", "execution_count": null, "id": "75bbab52", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "0361fb47", "metadata": {}, "source": [ "### Exercice sur l'algorithme de sommation de Kahan\n", "1. Implémenter une fonction \"naïve\" `MySum` faisant la somme des composantes d'un vecteur `X`\n", "1. Implémenter l'algorithme `KahanSum`\n", "1. Choisir un type `T`, un entier `n` et construire le vecteur \n", "`X=[one(T),eps(T)/2,...,eps(T)/2]` où `eps(T)/2` est répété $n-1$ fois\n", "1. Comparer les sommes obtenues en utilisant les fonctions `MySum`, `sum` et `KahanSum` sur `X` ainsi que sur `view(X,n:-1:1)`\n", "1. Construire un vecteur aléatoire `Y=rand(T,n)` ainsi qu'une version ordonnée `Ỹ=sort(Y)`\n", "1. Comparer les sommes obtenues sur `Y` et `Ỹ` avec les différents algorithmes. On pourra notamment se servir de la bibliothèque [`Xsum.jl`](https://github.com/JuliaMath/Xsum.jl) comme référence.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "e0280003", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "dae91c44", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "12b7cf25", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "7e24d195", "metadata": {}, "source": [ "### Exercice sur la différentiation numérique\n", "\n", "1. On pose $f(x)=\\exp{x}$, $x_0=1$ et $d(δ)=\\frac{f(x_0+δ)-f(x_0)}{δ}$.\n", " Tracer l'erreur commise entre $d(δ)$ et $f'(x_0)=\\exp{x_0}$ en fonction de $δ ∈ [10^{-17},10^{0}]$ sur un graphe log-log en repérant les droites verticales d'équations $δ=ε_M$ et $δ=\\sqrt{ε_M}$.\n", "\n", "1. Refaire la question précédente avec une fonction quelconque dont la dérivée exacte sera calculée par différentiation numérique à l'aide de la bibliothèque [`Zygote.jl`](https://github.com/FluxML/Zygote.jl).\n", "\n", "*Indication :*\n", "\n", "Les graphiques peuvent être tracés grâce à la bibliothèque [`Plots.jl`](https://github.com/JuliaPlots/jl)\n", "\n", "- [dépôt GitHub](https://github.com/JuliaPlots/jl)\n", "\n", "- [documentation](https://docs.juliaorg/stable/)\n", "\n", "- [tutoriel](https://docs.juliaorg/stable/tutorial/#tutorial)\n", "\n", "- Il est possible de définir des options de tracé par défaut (qui peuvent être redéfinies ponctuellement au besoin) par\n", "\n", " ```julia\n", " Plots.default(fontfamily=\"Computer Modern\",\n", " titlefontsize=20,\n", " xlabelfontsize=20,\n", " ylabelfontsize=20,\n", " legendfontsize=16,\n", " xtickfontsize=16,\n", " ytickfontsize=16,\n", " linewidth=2,\n", " markersize=7,\n", " framestyle=:box,\n", " label=nothing,\n", " grid=true)\n", " ```\n" ] }, { "cell_type": "code", "execution_count": null, "id": "a65b3f2c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "47ef456e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "22601b00", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "citation-manager": { "items": {} }, "kernelspec": { "display_name": "Julia 1.8.5", "language": "julia", "name": "julia-1.8" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.8.5" } }, "nbformat": 4, "nbformat_minor": 5 }