On Thursday, 20 August 2015 at 21:10:27 UTC, Steven Schveighoffer
wrote:
On 8/20/15 4:31 PM, Unknow wrote:
module main;
import std.file;
import std.conv;
long factorial(long i){
if (i == 0){
return 1;
}else{
return(i * factorial(i-1));
}
}
Note, this is not going to work. At 21!, long will run out of
bits.
From https://en.wikipedia.org/wiki/Factorial, 100! is
9.332621544×10^157, requiring 157 *decimal* digits, not to
mention the base-2 digits that would be required.
void main(string[] args){
real *e; e = new real; *e = 0; long *integer; integer =
new long;
*integer = 1;
There is no need for this, you are making pointers from
everything, just declare the variables:
real e = 0;
long integer = 1;
for(; *integer <= 100; *integer++){
And here is why you crash. *integer++ means return the value
currently pointed at by integer, then increment the POINTER by
one. This points at some garbage memory (on my system, it
happens to be zeroed, so it didn't crash).
Not using pointers will help a lot in this code.
*e = (*e) + (*integer / factorial(*integer));
The second portion of this calculation is INTEGER math, which
means except for 1 / 1, it's going to be 0. What you want is
(with new style that doesn't use pointers):
e = e + (real(integer) / factorial(integer));
The real(...) casts the result to a real before continuing.
}
if(exists("e") != 0)
{
std.file.write("e", to!string(*e));
Just want to confirm here, you are writing e only if it
*already exists*?
}else{
//...
}
delete(e); delete(integer);
Without pointers, you would remove these. In addition, you do
not need to delete pointers even if you did use them -- D is
garbage collected.
}
-Steve
Thanks a lot of! Im new to D lang.