Skip to content
Oct 3 11

Ray Kurzweil – Quelques pistes concernant notre avenir

par Olivier Balais

Quelques vidéos de Raymond Kurzweil ont été publiées sur Arte.tv.
La description que fait Kurzweil de notre futur correspond assez bien à celle du monde dans lequel je pense que nous vivrons dans quelques années. Un bon moyen de mettre facilement des mots sur mes pensées…

Qu’est-ce que la Singularité ?

“En 2029 l’intelligence des ordinateurs sera égale à celle des humains. En 2045 les ordinateurs seront tellement plus puissants que nos petits 100 milliards de neurones qu’on ne peut absolument pas prévoir ce qu’il va se passer.”

Lève-toi et marche :

“Ray kurzweil a stocké tous les bibelots, mèches de cheveux et autres souvenirs de feu son père, et il compte bien sur l’intelligence artificielle pour le faire revenir à la vie !”

Body 2.0 :

“Ray Kurzweil nous propose de remplacer nos organes déficients par des répliques artificielles beaucoup plus puissantes et résistantes.”

Ray Kurzweil – Coup de foudre avec un droïde :

“Selon Kurzweil, à partir de 2029, les robots seront tellement “convaincants” qu’on pourra très bien avoir le béguin pour Terminator”

Ray Kurzweil – de l’immortalité :

“Adepte de la médication anti-vieillissement, Ray Kurzweil explique que la mort est loin d’être une fatalité, puisque la clé de l’immortalité est entre nos mains.”

Ray Kurzweil – Vivre 500 ans ?

“Vivre 500 ans, c’est un peu long ? Pas d’après Kurzweil qui nous rappelle que d’ici là, on pourra changer de corps comme de chemise et vivre une multitude de vies trépidantes.”

Ray Kurzweil – Objectif Mars ?

“Selon Kurzweil, l’humanité manquant de ressources, nous enverrons des robots dans l’espace d’ici 2045.”

Jul 6 11

Problème avec PHP et ksort / asort / sort sur les strings représentant de grands entiers

par Olivier Balais

La semaine passée, en essayant de trier des tableaux avec la fonction sort de PHP, je suis tombé sur un résultat assez surprenant :


php> $array = array('90000000000000000001', '90000000000000000003', '90000000000000000002');

php> var_dump($array);
array(3) {
  [0]=>
  string(20) "90000000000000000001"
  [1]=>
  string(20) "90000000000000000003"
  [2]=>
  string(20) "90000000000000000002"
}

php> sort($array);

php> var_dump($array);
array(3) {
  [0]=>
  string(20) "90000000000000000002"
  [1]=>
  string(20) "90000000000000000003"
  [2]=>
  string(20) "90000000000000000001"
}

Dans la trace ci-dessus, on constate que mon tableau contient trois chaînes ’90000000000000000001′, ’90000000000000000003′ et ’90000000000000000002′ qui devraient donc, a priori, être triées dans cet ordre après un appel à sort :

  1. ’90000000000000000001′
  2. ’90000000000000000002′
  3. ’90000000000000000003′

Ce n’est malheureusement absolument pas le cas :

  1. ’90000000000000000002′
  2. ’90000000000000000003′
  3. ’90000000000000000001′

Pire, si on re-exécute un sort sur ce tableau, on obtient un ordonnancement différent :

  1. ’90000000000000000001′
  2. ’90000000000000000003′
  3. ’90000000000000000002′

Il s’avère en fait que PHP interpréte cette chaîne comme un entier. Et étant donné que PHP gère assez mal les large numbers, il se retrouve en fait à faire, dans le cas présent, un sort sur les valeurs suivantes :

  1. 9.0E+19
  2. 9.0E+19
  3. 9.0E+19

Les trois chaînes du tableau sont donc converties en entier puis arrondies et PHP les considèrent dès lors comme identiques. Ce qui explique le sorting foireux !
La solution dans ce genre de cas est de forcer PHP à interpréter les valeurs de ce tableau comme des chaînes et non pas comme des entiers. Pour cela :


php> sort($array, SORT_STRING);

Mais encore faut-il qu’on sache exactement à l’avance, le type de valeurs qu’on veut trier…

Une autre solution apportée par @mageekguy est d’utiliser la fonction natsort qui répondrait plus correctement au présent problème :


php> $array = array('90000000000000000001', '90000000000000000003', '90000000000000000002');

php> var_dump($array);
array(3) {
  [0]=>
  string(20) "90000000000000000001"
  [1]=>
  string(20) "90000000000000000003"
  [2]=>
  string(20) "90000000000000000002"
}

php> natsort($array);

php> var_dump($array);
array(3) {
  [0]=>
  string(20) "90000000000000000001"
  [1]=>
  string(20) "90000000000000000002"
  [2]=>
  string(20) "90000000000000000003"
}