2011-04-28 4 views
5

Je me présente des problèmes en ce qui concerne l'utilisation du paquet Brobdingnag - après avoir régléUtilisation du paquet 'Brobdingnag' en langage R

a2 <- as.brob(0.1)^1000, 

a2 = exp (-2302,6)

a1 <- as.brob(0.1)^800, 

a1 = exp (-1842.1)

J'obtiens des résultats différents pour utiliser sum (a1, a2) et sum (a2, a1) - Chaque fois que le résultat est égal au premier argument donné à la fonction sum. Il semble que peut-être la somme n'est pas annulée par le paquet de Brobdingang même si c'est supposé le faire? Ou peut-être que je fais quelque chose de mal?

J'ai posé cette question aussi comme une réponse à une autre question que j'ai écrit, voir here

[EDIT: Réponse de l'auteur du paquet]

Salut Dan

C'est sans aucun doute un bug dans le paquet; merci pour le reportage! Malheureusement, corriger cela me prendra beaucoup de temps .

En attendant, s'il vous plaît trouverez ci-dessous l'idiome habituel R pour calculer la somme de deux brobs:

> a1 <- as.brob(0.1)^800 
> a2 <- as.brob(0.1)^1000 
> a1+a2 


> a1 <- as.brob(0.1)^800 
> a2 <- as.brob(0.1)^1000 


> a1+a2 
[1] +exp(-1842.1) 
> a2+a1 
[1] +exp(-1842.1) 

> sum(cbrob(a1,a2)) 
[1] +exp(-1842.1) 
> sum(cbrob(a2,a1)) 
[1] +exp(-1842.1) 
> 

Répondre

2

Je peux reproduire votre problème avec le code suivant. Une réponse pourrait être à + au lieu de sum. Ajouté: Une autre solution serait d'avoir vos données dans un vecteur avant de faire la somme

> library(Brobdingnag) 
> (a1 <- as.brob(0.1)^800) 
[1] +exp(-1842.1) 
> (a2 <- as.brob(0.1)^1000) 
[1] +exp(-2302.6) 
> 
> a1 + a2 
[1] +exp(-1842.1) 
> a2 + a1 
[1] +exp(-1842.1) 
> 
> sum(a1, a2) 
[1] +exp(-1842.1) 
> sum(a2, a1) 
[1] +exp(-2302.6) 
> 
> sum(as.brob(0.1)^c(1000,800)) 
[1] +exp(-1842.1) 
> sum(as.brob(0.1)^c(800,1000)) 
[1] +exp(-1842.1) 

Il semble que vous ne pouvez pas utiliser sum(,) comme ça. Voici quelques résultats étranges similaires avec des nombres plus pratiques

> as.brob(0.1) + as.brob(1)   # OK, gives exp(ln(1.1)) 
[1] +exp(0.09531)  
> as.brob(1) + as.brob(0.1)   # OK, gives exp(ln(1.1)) 
[1] +exp(0.09531) 
> sum(as.brob(c(0.1, 1)))    # OK, gives exp(ln(1.1)) 
[1] +exp(0.09531) 
> sum(as.brob(c(1, 0.1)))    # OK, gives exp(ln(1.1)) 
[1] +exp(0.09531) 
> 
> sum(as.brob(0.1), as.brob(1))  # not OK, gives first term exp(ln(0.1)) 
[1] +exp(-2.3026) 
> sum(as.brob(1), as.brob(0.1))  # not OK, gives first term exp(ln(1)) 
[1] +exp(0) 
+0

Bizarre - J'ai envoyé un email au créateur du paquet, laisse voir s'il répond. Utiliser le signe + au lieu d'une somme est un problème, car j'ai une matrice de brutes et je veux additionner ses lignes (plusieurs fois), et cela voudrait dire que je devrais ajouter des boucles de '+' juste pour obtenir la somme - pas horrible, mais plutôt moche – dan12345

+0

@ user206903: Une matrice ne devrait pas poser de problème. Par exemple 'sum (as.brob (0.1)^c (1000.800))' et 'sum (as.brob (0.1)^c (800.1000))' donnent tous les deux le même résultat (je pense correct). Je vais ajouter ceci ci-dessus – Henry