Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Java] check of acos(double) NaN teruggeeft.

Pagina: 1
Acties:

  • Teun_2
  • Registratie: Oktober 2003
  • Laatst online: 14-11 07:36
Hallo,

Ik wil graag de arccosinus bereken van iets. Als die echter buiten het geldige bereik ligt, dan krijg ik NaN terug. Om dit op te vangen heb ik momenteel:
Java:
1
String.valueOf(Math.acos(argument)).equals("NaN")


Wat uiteraard behoorlijk lelijke code is. Is er een mooiere manier voor?

Edit: Double.isNaN(variable) werkt ook :D |:( 8)7

[ Voor 7% gewijzigd door Teun_2 op 03-04-2008 16:48 ]


Verwijderd

EDIT: volgende uitleg is enkel voor de cos geldig en niet voor arccos...

Beetje wiskunde is altijd handig, de cosinus heeft een periode van 2*pi, dus kan je je argument gewoon omvormen naar

argument % (2*pi) (met % als de modulo, rest bij deling, operator), in graden wordt dit uiteraard gewoon 360...

Zo zal je argument altijd [0, 2*pi[ liggen en moet je je hierom geen zorgen maken

[ Voor 10% gewijzigd door Verwijderd op 03-04-2008 20:18 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-11 23:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

Euhm, nee :). Cosinus heeft idd een periode, maar het domein is oneindig. Het bereik echter ligt tussen -1 en +1, wat betekent dat de inverse cosinus (acos dus) geen geldige uitkomst heeft voor waarden kleiner dan -1 en groter dan +1.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

jup, je hebt compleet gelijk, effe over de "A" in acos gelezen, excuses :-)

  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01 18:01

Ivo

code:
1
Math.acos(argument) != Math.acos(argument)

Dit is het eerste wat bij me opkomt om op NaN te testen, maar ik weet niet hoe dit zich in performance verhoudt tot de implementatie van Double.isNaN(). Ik verwacht dat Double.isNaN() ten minste zo efficient is als mijn oplossing.

[ Voor 15% gewijzigd door Ivo op 04-04-2008 13:54 ]


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 19:04

voodooless

Sound is no voodoo!

Ivo schreef op vrijdag 04 april 2008 @ 13:53:
ik weet niet hoe dit zich in performance verhoudt tot de implementatie van Double.isNaN(). Ik verwacht dat Double.isNaN() ten minste zo efficient is als mijn oplossing.
Java:
1
2
3
4
5
6
7
8
9
10
11
/**
     * Returns <code>true</code> if the specified number is a
     * Not-a-Number (NaN) value, <code>false</code> otherwise.
     *
     * @param   v   the value to be tested.
     * @return  <code>true</code> if the value of the argument is NaN;
     *          <code>false</code> otherwise.
     */
    static public boolean isNaN(double v) {
    return (v != v);
    }


:+

Do diamonds shine on the dark side of the moon :?


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 13:37

Robtimus

me Robtimus no like you

Ivo schreef op vrijdag 04 april 2008 @ 13:53:
code:
1
Math.acos(argument) != Math.acos(argument)

Ik verwacht dat Double.isNaN() ten minste zo efficient is als mijn oplossing.
Wel aangezien je 2x acos aanroept ;)

Als je die waarde had gecachet dan was jouw oplossing zelfs een hele functieaanroep efficienter 8)

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Is het niet makkelijker om je argument te checken in plaats van het resultaat ?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-11 23:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

@IceManX: Ware het niet dat de VM waarschijnlijk slim genoeg is om niet twee keer acos aan te roepen, en of die functie wordt geinlined of niet is al helemaal geen zinnig woord over te zeggen.

In C++:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <cmath>

bool isNan(float a, float b)
{
    return a == b;
}

int main()
{
    float a = acos(1.5f);
    float b = acos(1.5f);
    std::cout << isNan(a, b) << std::endl;
}


GAS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
00415440  push        ecx  
    float a = acos(1.5f);
    float b = acos(1.5f);
00415441  fld         qword ptr [__real@3ff8000000000000 (41D608h)] 
00415447  call        _CIacos (415590h)           ; slechts 1 aanroep naar acos
0041544C  fstp        dword ptr [esp] 
    std::cout << isNan(a, b) << std::endl;
0041544F  fld         dword ptr [esp] 
00415452  fcomp       dword ptr [esp]             ; isNan() wordt geinlined
00415455  fnstsw      ax   
00415457  test        ah,44h 
0041545A  jp          main+23h (415463h) 
0041545C  mov         eax,1 
00415461  jmp         main+25h (415465h) 
00415463  xor         eax,eax 
00415465  push        esi  
00415466  push        edi  
00415467  push        eax  
00415468  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (401780h)
; ... etc [nog meer std::ostream mumbo jumbo en functie exit]


En oh ja: 8)
:P

[ Voor 131% gewijzigd door .oisyn op 04-04-2008 17:27 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1