digitalmars.D - Clarification on testsuite 'runnable/testmath.d'
- Daniel Green (23/23) Jan 13 2012 I've been working on fixing GDC/MinGW's runtime support. I ran across
- Walter Bright (2/4) Jan 14 2012 3.0 should match double, when there is both double and real.
- Daniel Green (16/26) Jan 14 2012 When I run the following through DMD r is type real. For GDC r is type
- Iain Buclaw (7/38) Jan 14 2012 Strange, I get 'double' for both DMD and GDC... is this maybe a Windows ...
- Daniel Green (3/4) Jan 14 2012 Just ran it with linux and got 'double' as well. So it appears to be a
- Iain Buclaw (15/31) Jan 14 2012 I think the only difference may be that gdc possibly folds the call to
I've been working on fixing GDC/MinGW's runtime support. I ran across the following and was hoping to get a clarification on what DMD does differently than GDC. void testexp() { printf("exp(3.0) = %Lg, %Lg\n", exp(3.0), E * E * E); assert(equals(exp(3.0), E * E * E, 16)); } Of interest is exp(3.0). GDC matches exp(3.0) to double exp(double). This causes problems with printf due to %Lg wanting a real but only receiving a double. Looking at the D specification for overloading functions. 1. no match 2. match with implicit conversions 3. match with conversion to const 4. exact match The specification doesn't indicate what levels are better. I would guess 4 is the best since an exact match should take precedence. However, that results in GDC matching exp(3.0) to double exp(double). How does DMD match exp(3.0)? Could it possibly be a typo? For 32-bit this test passes because the printf doesn't segfault, it's only noticeable with 64-bit since it segfaults.
Jan 13 2012
On 1/13/2012 10:51 PM, Daniel Green wrote:Could it possibly be a typo? For 32-bit this test passes because the printf doesn't segfault, it's only noticeable with 64-bit since it segfaults.3.0 should match double, when there is both double and real.
Jan 14 2012
On 1/14/2012 3:29 AM, Walter Bright wrote:On 1/13/2012 10:51 PM, Daniel Green wrote:On 1/14/2012 3:29 AM, Walter Bright wrote:Could it possibly be a typo? For 32-bit this test passes because the printf doesn't segfault, it's only noticeable with 64-bit since it segfaults.3.0 should match double, when there is both double and real.On 1/13/2012 10:51 PM, Daniel Green wrote:When I run the following through DMD r is type real. For GDC r is type double. The matched function would be double exp(double x) safe pure nothrow { return exp(cast(real)x); }. Is it expected that DMD promotes a double to real? // GDC: r is type double // DMD: r is type real import std.stdio; import std.math; void main() { auto r = exp(3.0); writefln("%s", typeof(r).stringof); }Could it possibly be a typo? For 32-bit this test passes because the printf doesn't segfault, it's only noticeable with 64-bit since it segfaults.3.0 should match double, when there is both double and real.
Jan 14 2012
On 14 January 2012 15:20, Daniel Green <venix1 gmail.com> wrote:On 1/14/2012 3:29 AM, Walter Bright wrote:}.On 1/13/2012 10:51 PM, Daniel Green wrote:On 1/14/2012 3:29 AM, Walter Bright wrote:Could it possibly be a typo? For 32-bit this test passes because the printf doesn't segfault, it's only noticeable with 64-bit since it segfaults.3.0 should match double, when there is both double and real.On 1/13/2012 10:51 PM, Daniel Green wrote:When I run the following through DMD r is type real. =A0For GDC r is type double. The matched function would be =A0 double exp(double x) safe pure nothrow =A0{ return exp(cast(real)x);=Could it possibly be a typo? For 32-bit this test passes because the printf doesn't segfault, it's only noticeable with 64-bit since it segfaults.3.0 should match double, when there is both double and real.Is it expected that DMD promotes a double to real? // GDC: r is type double // DMD: r is type real import std.stdio; import std.math; void main() { =A0 =A0auto r =3D exp(3.0); =A0 =A0writefln("%s", typeof(r).stringof); }Strange, I get 'double' for both DMD and GDC... is this maybe a Windows thi= ng? --=20 Iain Buclaw *(p < e ? p++ : p) =3D (c & 0x0f) + '0';
Jan 14 2012
On 1/14/2012 10:34 AM, Iain Buclaw wrote:Strange, I get 'double' for both DMD and GDC... is this maybe a Windows thing?Just ran it with linux and got 'double' as well. So it appears to be a Windows thing.
Jan 14 2012
I think the only difference may be that gdc possibly folds the call to exp(). Check the difference between what code gdc generates compared to how gcc processed it: -fdump-tree-original -fdump-tree-optimized ---- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0'; On 14 Jan 2012 06:56, "Daniel Green" <venix1 gmail.com> wrote:I've been working on fixing GDC/MinGW's runtime support. I ran acrossthe following and was hoping to get a clarification on what DMD does differently than GDC.void testexp() { printf("exp(3.0) = %Lg, %Lg\n", exp(3.0), E * E * E); assert(equals(exp(3.0), E * E * E, 16)); } Of interest is exp(3.0). GDC matches exp(3.0) to double exp(double).This causes problems with printf due to %Lg wanting a real but only receiving a double.Looking at the D specification for overloading functions. 1. no match 2. match with implicit conversions 3. match with conversion to const 4. exact match The specification doesn't indicate what levels are better. I would guess4 is the best since an exact match should take precedence.However, that results in GDC matching exp(3.0) to double exp(double). How does DMD match exp(3.0)? Could it possibly be a typo? For 32-bit this test passes because theprintf doesn't segfault, it's only noticeable with 64-bit since it segfaults.
Jan 14 2012