2017-03-17 1 views
3

Lors de l'estimation de la tangente hyperbolique dans Windows en utilisant la fonction de base de R tanh de grande taille (réel, avec 0 partie imaginaire) des valeurs de la fonction retourne de NaN ':Tangente hyperbolique dans R jette NAN sous Windows mais pas sur Mac?

tanh(356 + 0i) 
> NaN + 0i 

Toutefois, Mac la même valeur renvoie 1 (qui coïncide avec la valeur mathématique « réelle » devrait être proche de 1):

tanh(356 + 0i) 
> 1 + 0i 

question 1: est-ce que quelqu'un a une idée sur pourquoi est-ce qui se passe?

Extra info

Cela ne semble pas un problème de virgule flottante car il semble que tanh Mac renvoie 1 pour des valeurs arbitrairement grandes:

tanh(999999677873648767519238192348124812341234182374817239847812738481234871823+0i) 
> 1 + 0i 

Le problème semble être lié à la partie imaginaire comme:

tanh(356) 
> 1 

dans Windows et Mac. La question semble être le système - spécifique que nous avons essayé (ou processeur?):

  • Mac avec El Capitan v 10.11.6 Processeur: 2.7 GHz Intel Core i5
  • Mac avec Sierra v 10.12.3 processeur: 3.2 GHz Intel Core i5
  • de Windows 10 Accueil v 1607 processeur: Intel Core CPU-m3 SY30 @ 0,90 GHz 1.51 GHz
  • Windows 7 Édition Familiale premium service pack 1 processeur: Intel Core CPU i5-2410M @ 2.30 GHz 2.30GHz.

Ces machines Windows jettent NaN, le Mac 1 + 0i. Dans tous les cas, nous utilisons R version 3.3.3 le "plus récent" (64 bits).

+1

Intéressant, sur windows v 3.3.2 J'obtiens [1] "NaN + 0i". – thc

+0

Je recevais aussi le '+ 0i' que je ne l'ai pas copié correctement. J'ai édité maintenant le terme. –

+0

Ubuntu semble avoir le même comportement qu'un mac – OganM

Répondre

4

@Ben Bolker est sur place. Windows utilise des bibliothèques C quelque peu anciennes, et c'est ici la partie "mathlib" de la glibc.

Plus précisément, selon la page de téléchargement de R-CRAN devel pour Windows https://cran.r-project.org/bin/windows/base/rdevel.html, la série R 3.3.z utilise le gcc 4.6.3 (Mars 2012) toolchain, alors que "R-devel", le prochain (pas encore publié!) La série R 3.4.z utilise la chaîne d'outils gcc 4.9.3 (juin 2015).

** Cependant * Je viens de vérifier (installé le binaire R-devel de CRAN sur notre machine virtuelle serveur Windows) et je vois que le problème est toujours présent: Dans la version d'hier de R-devel, tanh(500+0i) renvoie NaN+0i.

Je pense que maintenant une meilleure solution serait d'utiliser de remplacement interne de R (en R de src/main/complex.c): Nous avons

#ifndef HAVE_CTANH 
#define ctanh R_ctanh 
static double complex ctanh(double complex z) 
{ 
    return -I * ctan(z * I); /* A&S 4.5.9 */ 
} 
#endif 

et nous devrions l'utiliser, comme je vois qu'en effet, également sous Windows,

R> -1i * tan((500+0i)*1i) 

donne

[1] 1+0i 

comme il devrait pour tanh(500+0i) --- mais ne fonctionne pas sur Windows.