I'm trying to write a Java program that can take values and put them into a formula involving log 1/3.
How can I calculate log 1/3 in Java?
When you want to calculate the logarithm you need to know the base. Once you know the base you can perform the calculation:
log_b(x) = ln(x) / ln(b)
http://en.wikipedia.org/wiki/Logarithm#Change_of_base
In Java the Math#log(double) function calculates the natural logarithm. So you can use this to calculate the logarithm to a given base b:
double result = Math.log(x) / Math.log(b);
You can use Math.log(value) to get log of specific value where value is considered to be in double.You can also use Math.log10(value) to get base 10 log.
So you can just use
Math.log(1/3.0)
1/3 yields the result as integer type value. So, the result will be 0, not 0.3333.
Therefore, Math.log(1/3) = Math.log(0), which results in infinity.
So, you need to write Math.log(1/3.0) to get the desired result.
You can calculate the natural logarithm using the Java.lang.Math.log() method:
System.out.println("Math.log(1/3.0)=" + Math.log(1/3.0));
See http://www.tutorialspoint.com/java/lang/math_log.htm and http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#log%28double%29
In order to get the log_10 you can do it as follows:
System.out.println("log_10(1/3.0)=" + (Math.log(1/3.0)/Math.log(10)));
You don't need a new implementation there is inbuilt function for this
Read about Math.log()
But in this case log(1/3) will give you value as infinity,If you use Math.log(1/3).
You can use log rule as follows.
log(1/3) =log(1)-log(3)
Now
Math.log(1/3)=Math.log(1)-Math.log(3)
Eg:
System.out.println(Math.log(1)-Math.log(3));
Out put:
-1.0986122886681098
Related
I am trying to find the result of log(10^k) , where k is big number like 10000. For example :
BigDecimal first = BigDecimal.TEN.pow(10000);
double result = Math.log(first.doubleValue());
However "result" becomes Infinity , however on wolphram approximates it to 23025.85.Any suggestion how to find the result? As a result the number with the first two digits after the decimal point are enough for me.
Use the fact that
log(10^k) = k*log(10)
So:
System.out.println(10000 * Math.log(10));
Prints:
23025.850929940458
The problem you are likely having, is that Wolphram is able to either hold the powered value or it is doing the log operation first.
When running this like your example, you will have an extremely large number that goes past the maximum value for a BigDecimal, which should result in an error or an "infinity", because it overflows the capability of the data type, I would suggest doing the operation the other way arround, perhaphs process the log first on a base 1 value for example and only then multiply it by whatever powered number you are tying to use.
See, there is a simple property of logarithms that you can use:
log(x^y) = y*log(x)
So what you can do is:
double y = y*log(x);
System.out.println(Math.round(y));
Hope this helps!
I want to find a remainder of very long numbers .I am writing a program for this and as I cannot find the remainder directly due to the fact that they are large numbers (in c) .How can I do this?the limit for the number from which I have to divide the bigger number to find remainder is 500.i.e 1 to 500
I thought of dividing the number like this:
1234567=1*10^6+2*10^5+...
1234567%x=1modx*10^6modx+2modx*10^5modx...
I need a better way than this.
Hint:
Use a linked list. Store the number as a group of numbers dynamically.
For eg:
112233445566778899001122 => 11223344 55667788 99001122
Now consider the individual unit and start from left to right. Find the reminder and manipulate it to add to the next group and go on.
Now implementation is very easy :)
Edit:
112233445566778899001122/6 => 11223344 55667788 99001122/6
11223344/6 =>2
2*100000000 + 55667788 = 255667788
255667788/6 => 0
0*100000000 + 99001122 = 99001122
99001122/6=>0
So the reminder is 0.
Remember, the individual unit after manipulation should be under the maximum range int can support.
If your question regards using very long or large numbers try using something a long long. The problem could be that the data type that you are using is too small to hold the values that you require.
You could try using a bignum library like GMP or another kind of ugly way in comparison would be to use arrays or lists, somewhat similar to this.
Other than that, the modulo operation % will calculate the remainder for you.
Hi All it might be a trivial question but as for now I could not find any solution.So asking for your help!
What I am trying to get is a specific encoding table that looks like this:
0.000
0.100
0.200
I need to keep track of zeroes as I will use them to reconstruct a part of an specific array. Original loop that was creating those numbers is:
for(int k=0;k<m_0;k++){
for(int l=0;l<m_1;l++){
for(int a=0;a<a1;a++){
Y[x-1]=0.1*k+0.01*l+0.001*a;
x++;
}
}
}
Problem! I could not fix zeros after decimal place and rather then getting table described above I am getting following:
0.0
0.1
0.2
As a solution I have tried to use BigDecimal and DecimalFormat but no success. Any suggestions?
UPD Few words what I am trying to do. I am encoding specific array to array and back index correspondence. For example 0.100 will be decomposed into 1 and 0 and 0 and used as array index labeling like:
Array1[Method(1,0,0,Y(i)][Method(1,0,0,Y(i))]=Array2[1][0][0]
So that I need an output suitable for assigning array index and string will not do the deal.
The DecimalFormat class is the correct place to look. You just need the correct format.
DecimalFormat df = new DecimalFormat("0.000");
System.out.println(df.format(0.1));
Output:
0.100
As an alternative to the DecimalFormat class, I would like to propose the following (which I use quite regularly):
Step 1: Create a function that allows me to specify the number of units to keep. Here is a copy of this function.
public static String format(Number n) {
NumberFormat format = DecimalFormat.getInstance();
format.setRoundingMode(RoundingMode.FLOOR);
format.setMinimumFractionDigits(0);
format.setMaximumFractionDigits(2);
return format.format(n);
}
Step 2: Call the function whenever you have any output to format. Below is a simple example using this function to set the appropriate decimal place length:
System.out.println("Based on this, the wind chill index was calculated to be " + format(chill));
Note that you could simply change the line:
format.setMaximumFractionDigits(2);
to
format.setMaximumFractionDigits(n);
depending on your desired decimal length.
When you are printing the numbers, you can use this:
System.out.format("%.3f", yourDecimalNumber);
I'm using java and Apache derby to create a project that deals with big numbers. Everything is going fine except when i store big numbers.
For eg. when i save 1000000000 through my java class to a derby table, it automatically becomes 1.0E9. When this value is retrieved in another form it is displayed like 1.0E9. How can I stop this? I'm using float data type to do this.
In other words, how can I save 1000000000 as 1000000000 and not 1.0E9
Like above said you could use a BigInteger or you could just covert 1.0E9 to what the number actually is. 1.0 x 10^9.
1.0e9 is the same as 1000000000; it's just a representation issue. You just have to apply the proper formatters when transforming it to a string.
Two things that would make this easier are to use the NUMERIC column type in Derby, and also use either BigDecimal or BigInteger data types in your Java code, or possibly a long if you're confident that the long can hold the values in your problem domain.
import java.math.BigInteger;
//...
//...
//...
BigInteger store = new BigInteger("1000000000");
This is basically what I am trying to do
// ... some code, calculations, what have you ...
long timeToAdd = returnTimeToAddInLongFormat();
// lets output the long type now, and yes i need the width and precision.
System.out.printf("Time to add: %13.10ld", timeToAdd);
I've read most of the google searches around the topic and think I understand how to do it conceptually, but the JRE keeps throwing me a UnknownFormatConversionException and telling me my input size modifier l doesnt work.
Is there another way to do this, or did I miss something small?
Java treats all integer values as d, there is no ld. Even byte and BigInteger is a d type. It also assumes integers have no decimal places. If you want to show 10 zeros, you can convert to double first and use f