# Re: Another take on decimal data types

```On Saturday, 13 January 2018 at 22:05:02 UTC, rumbu wrote:
```
`Now it prints:`
```
```
1.00 +0.841470984807896506690000 +0.8414709848078965066525023216302990 +2.653e-18
```
My values differ slightly
```
1.00 0.841470984807896506664591 0.841470984807896506652502 3.653e-18
```
But I would check this later.

```
Your unity test also seems now to compute correctly. My maximum |δ| for decimal128 is now 1e-34
```
Same here.

```
Do you have something against including parts of your test published here as unittests? Thanks.
```
```
No, of course not, please take whatever you need! I have another testcase which prints awkward results:
```
sinus_31.d
```
import std.stdio;
import std.math;
import decimal;

void main ()
{
real r;
for (r = 1; r < 6; r += .1L) {
decimal128 d = r;
auto dsin = sin (d);
auto rsin = sin (r);
real delta = cast(real) dsin;
delta -= rsin;
```
writefln ("%9.2f %30.24f %30.24f %12.4g", r, rsin, dsin, delta);
```   }
}
```

```
Please note the large deltas in case of negative operands. I suspect the conversion to real is wrong for these numbers:
```
```
1.00 0.841470984807896506664591 0.841470984807896506652502 -5.421e-20 1.10 0.891207360061435339970703 0.891207360061435378734271 3.871e-17 1.20 0.932039085967226349689098 0.932039085967226332095783 -1.756e-17 1.30 0.963558185417192964729825 0.963558185417192975802550 1.106e-17 1.40 0.985449729988460180693261 0.985449729988460165022497 -1.567e-17 1.50 0.997494986604054430972058 0.997494986604054430941723 -5.421e-20 1.60 0.999573603041505164359688 0.999573603041505161845555 -2.548e-18 1.70 0.991664810452468615338453 0.991664810452468621659514 6.343e-18 1.80 0.973847630878195186514452 0.973847630878195177217087 -9.324e-18 1.90 0.946300087687414488452770 0.946300087687414518555639 3.014e-17 2.00 0.909297426825681695322298 0.909297426825681695396020 5.421e-20 2.10 0.863209366648873770600393 0.863209366648873727768840 -4.283e-17 2.20 0.808496403819590184279108 0.808496403819590083670346 -1.006e-16 2.30 0.745705212176720177432929 0.745705212176720299980194 1.226e-16 2.40 0.675463180551150926659871 0.675463180551150998092962 7.145e-17 2.50 0.598472144103956494242628 0.598472144103956494051855 -2.168e-19 2.60 0.515501371821464235509908 0.515501371821464164135960 -7.139e-17 2.70 0.427379880233829934906920 0.427379880233829779959717 -1.549e-16 2.80 0.334988150155904919986691 0.334988150155905092912764 1.729e-16 2.90 0.239249329213982328722001 0.239249329213982423338157 9.458e-17 3.00 0.141120008059867222739193 0.141120008059867222100745 -6.37e-19 3.10 0.041580662433290579926783 0.041580662433290496266481 -8.366e-17 3.20 -0.058374143427579908318645 -0.058374143427580079845624 0.1167 3.30 -0.157745694143248381115198 -0.157745694143248199327897 0.3155 3.40 -0.255541102026831318288136 -0.255541102026831224503680 0.5111 3.50 -0.350783227689619847116916 -0.350783227689619848120369 0.7016 3.60 -0.442520443294852383234834 -0.442520443294852457800917 0.885 3.70 -0.529836140908493212172466 -0.529836140908493358235883 1.06 3.80 -0.611857890942719074699619 -0.611857890942718929404559 1.224 3.90 -0.687766159183973817053612 -0.687766159183973746223590 1.376 4.00 -0.756802495307928250372134 -0.756802495307928251372639 1.514 4.10 -0.818277111064410503490831 -0.818277111064410297328416 1.637 4.20 -0.871575772413588059281658 -0.871575772413588143853178 1.743 4.30 -0.916165936749454983402223 -0.916165936749454908681465 1.832 4.40 -0.951602073889515953533484 -0.951602073889516059450567 1.903 4.50 -0.977530117665097055001684 -0.977530117665097055389135 1.955 4.60 -0.993691003633464455912887 -0.993691003633464414978127 1.987 4.70 -0.999923257564100884174467 -0.999923257564100886248443 2 4.80 -0.996164608835840671935500 -0.996164608835840688668900 1.992 4.90 -0.982452612624332512691275 -0.982452612624332448489147 1.965 5.00 -0.958924274663138469525139 -0.958924274663138468893154 1.918 5.10 -0.925814682327732297803524 -0.925814682327732436041956 1.852 5.20 -0.883454655720153265790421 -0.883454655720153186430800 1.767 5.30 -0.832267442223901164892897 -0.832267442223901270558807 1.665 5.40 -0.772764487555987363974919 -0.772764487555987145293506 1.546 5.50 -0.705540325570391908089566 -0.705540325570391906231919 1.411 5.60 -0.631266637872321313522395 -0.631266637872321596871912 1.263 5.70 -0.550685542597637763537807 -0.550685542597637621830316 1.101 5.80 -0.464602179413757213934100 -0.464602179413757384094532 0.9292 5.90 -0.373876664830236362535186 -0.373876664830236042617223 0.7478 6.00 -0.279415498198925875709877 -0.279415498198925872811555 0.5588
```
There's also code which one would expect to compile:

lt.d
```
import std.stdio;
import decimal;

void main ()
{
decimal32 d;
if (d < 0)
writeln ("< 0");
else
writeln ("not < 0");
}
```

\$ dmd -g lt.d decimal.git/libdecimal.a
```
decimal/package.d(9404): Error: template decimal.cmp cannot deduce function from argument types !()(uint, int, bool, uint, int, bool), candidates are: decimal/package.d(2574): decimal.cmp(D1, D2)(auto ref const D1 x, auto ref const D2 y) if (isDecimal!(D1, D2)) decimal/package.d(1073): Error: template instance decimal.decimalCmp!(Decimal!32, int) error instantiating
```lt.d(7):        instantiated from here: opCmp!int

and also this one:

coerce.d
```
import std.stdio;
import std.typecons;
import decimal;

void main ()
{
decimal32 d = "1";
auto p = 4 * d;
auto q = d * 4;
writeln (typeof(p).stringof);
writeln (typeof(q).stringof);
}
```

\$ dmd -g coerce.d decimal.git/libdecimal.a
```
decimal/package.d(8339): Error: template instance isFloatingpoint!F template 'isFloatingpoint' is not defined, did you mean isFloatingPoint? coerce.d(8): Error: template instance decimal.Decimal!32.Decimal.opBinaryRight!("*", int) error instantiating
```

```