Re: ieeeFlags are not getting set.

2013-09-29 Thread Manfred Nowak
Damien wrote:

 is not a D bug

I cannot reproduce your problem.

Giving 10^38 and 10 as parameters the lol is output correctly.

-manfred


Re: ieeeFlags are not getting set.

2013-09-28 Thread Damien

I have more information.
While doing some more experiment, I noticed that at some point a 
floating-point exception was thrown.


In the documentation, it says that floating-point exception are 
disabled by default. It further says that have floating-point 
exception enabled would disable the setting of ieeeFlags. I was 
also unable to disable those exception manually.


Still hoping someone telling me how stupid I am and that is not a 
D bug (omg this language has some puns potential...)

Damien


ieeeFlags are not getting set.

2013-09-27 Thread Damien

Hi everyone,

I am new to the D programming language and decided to use it for 
simple assignment. The idea is to compute the product of an 
arbitrary number of numbers and print the result in a specific 
way. The program needs to handle underflow/overflow, thus I 
decided to use ieeeFlags. The program is found below.


Basically, the flags are not getting set. Changing the the 
if-statements to check whether the resulting value is infinity or 
0 (to test respectively for overflow/underflow) and it works. So 
I am starting to think either I don't understand how this work, 
or there is a bug.


Damien

/**/

import std.stdio, std.exception, std.string, std.conv, 
std.math;


void printProduct(in float[] numberList)
{
float tmp = 1.0f, product = 1.0f;
int exponent = 0;

foreach (number; numberList) {
resetIeeeFlags();
tmp *= number; // The variable tmp is used to 
recover from errors.


if (ieeeFlags.overflow) {
writeln(lol);
while (product = 1.0f) {
product /= 10.0f;
++exponent;
}
product *= number; // Impossible to 
overflow anymore.

tmp = product;
} else if (ieeeFlags.underflow) {
while (product = 1.0f) {
product *= 10.0f;
--exponent;
}
product *= number; // Impossible to 
underflow anymore.

tmp = product;
} else {
product = tmp;
}
}

writeln(product,  times 10 to the power , exponent, 
.);

}

void main(string args[])
{
float[] numberList;
foreach (number; args[1..$]) {
enforce(isNumeric(number), Only numeric 
value are allowed as input.);

numberList ~= to!float(number);
}

writeln(The product is:);
printProduct(numberList);
}