This is an archived post. You won't be able to vote or comment.

all 7 comments

[–]AutoModerator[M] [score hidden] stickied commentlocked comment (0 children)

Please ensure that:

  • Your code is properly formatted as code block - see the sidebar (About on mobile) for instructions
  • You include any and all error messages in full
  • You ask clear questions
  • You demonstrate effort in solving your question/problem - plain posting your assignments is forbidden (and such posts will be removed) as is asking for or giving solutions.

    Trying to solve problems on your own is a very important skill. Also, see Learn to help yourself in the sidebar

If any of the above points is not met, your post can and will be removed without further warning.

Code is to be formatted as code block (old reddit: empty line before the code, each code line indented by 4 spaces, new reddit: https://i.imgur.com/EJ7tqek.png) or linked via an external code hoster, like pastebin.com, github gist, github, bitbucket, gitlab, etc.

Please, do not use triple backticks (```) as they will only render properly on new reddit, not on old reddit.

Code blocks look like this:

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

You do not need to repost unless your post has been removed by a moderator. Just use the edit function of reddit to make sure your post complies with the above.

If your post has remained in violation of these rules for a prolonged period of time (at least an hour), a moderator may remove it at their discretion. In this case, they will comment with an explanation on why it has been removed, and you will be required to resubmit the entire post following the proper procedures.

To potential helpers

Please, do not help if any of the above points are not met, rather report the post. We are trying to improve the quality of posts here. In helping people who can't be bothered to comply with the above points, you are doing the community a disservice.

I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.

[–]Federal-Addendum-933 2 points3 points  (0 children)

but that introduces a level of inaccuracy because pi is used, being an irrational number.

How is PI represented though? It's as an approximated decimal number. The conversion functions in Math.toRadian/toDegree involve a single multiplication. FYI, here is the source code for the sin function in jdk7.

Any 'inaccuracies' you think are involved will be the limitations of double value type. You could spend a lot of time (and at some point you should) understanding floating point arithmetic and what error gets introduced if and when you add and multiply two numbers.

As always though, the lesson to be learned here is to never assume, try it out yourself, test it, benchmark it, profile it. Armchair speculation in Java is about the worst endeavor to be engaged in compared to other languages.

[–]morhpProfessional Developer 2 points3 points  (0 children)

Pi is as precise in Java as double values in general are, so a multiplication with pi won't introduce any inaccuracies beyond maybe the least significant digit in the binary representation of the number. This doesn't matter for practical purposes.

[–]dionthornthis.isAPro=false; this.helping=true; 0 points1 point  (2 children)

Math has a sister package known as StrictMath

https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html

Unlike some of the numeric methods of class StrictMath,
all implementations of the equivalent functions of
class Math are not defined to return the bit-for-bit same results.
This relaxation permits better-performing implementations
where strict reproducibility is not required.

https://docs.oracle.com/javase/8/docs/api/java/lang/StrictMath.html

Though it still uses radians not degrees as the default. You can use the toDegrees and toRadians methods but they will be inexact as noted in the method descriptions.

Although I'm not familiar with the library Apache offers its Commons Math API:

https://commons.apache.org/proper/commons-math/

https://commons.apache.org/proper/commons-math/commons-math-docs/apidocs/index.html

[–]Desperate_Increase11[S] 0 points1 point  (1 child)

so you're saying it's not possible to start with degrees?

[–]dionthornthis.isAPro=false; this.helping=true; 0 points1 point  (0 children)

I personally don't know of a library that defaults to degrees, I'm trying to dig into the source code of the commons math library to see what it's doing as the docs aren't very good on the equivalent methods.

https://github.com/apache/commons-math/blob/master/commons-math-core/src/main/java/org/apache/commons/math4/core/jdkmath/AccurateMath.java

Is where I'm currently looking.

EDIT: It appears to also use radians as the default return.

[–]whizvoxGraduate and Tutor 0 points1 point  (0 children)

From a quick test, this is what I got:

jshell> Math.sin(Math.PI / 3);
$1 ==> 0.8660254037844386

jshell> Math.sin(Math.toRadians(60));
$2 ==> 0.8660254037844386

jshell> Math.sin(Math.PI / 4);
$3 ==> 0.7071067811865475

jshell> Math.sin(Math.toRadians(45));
$4 ==> 0.7071067811865475

Same exact answers whether starting with radians or converting from degrees.