Rapidement carré un double

Je suis à la recherche de la façon la plus rapide à la place d'un lit double (double d). Jusqu'à présent, je suis venu avec deux approches:

1. d*d
2. Math.pow(d, 2)

Pour tester la performance, j'ai mis en place trois cas de test, dans chacun, j'générer des nombres aléatoires à l'aide de la même graine pour les trois cas et il suffit de calculer le carré du nombre dans une boucle de 100 000 000 de fois.

Dans le premier cas de test numéros sont générés à l'aide de random.nextDouble()dans le second cas, à l'aide de random.nextDouble()*Double.MAX_VALUE et dans le troisième, à l'aide de random.nextDouble()*Double.MIN_VALUE.

Les résultats d'un couple de pistes (que des résultats approximatifs, il y a toujours des variations, exécuté à l'aide de java 1.8, compilé pour la version 1.6 de java sur Mac OSX Mavericks)

Approach | Case 1 | Case 2 | Case 3
---------•--------•--------•-------
    1    | ~2.16s | ~2.16s | ~2.16s
    2    | ~9s    | ~30s   | ~60s

La conclusion semble être que la méthode 1 est plus rapide mais aussi qui Math.pow semble se comporter de la sorte de bizarre.

J'ai donc deux questions:

1 Pourquoi est Math.pow si lent, et pourquoi faut-il faire face mal avec > 1 et encore pire avec < -1 numéros?

2 Est-il un moyen d'améliorer les performances sur ce que j'ai suggéré que l'approche 1? Je pensais à quelque chose comme:

long l = Double.doubleToRawLongBits(d);
long sign = (l & (1 << 63));
Double.longBitsToDouble((l<<1)&sign);

Mais c'est un faux, et b) la même vitesse que l'approche 1.

source d'informationauteur Samuel