ReactOS 0.4.16-dev-1946-g52006dd
log.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS API tests
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Tests for log
5 * COPYRIGHT: Copyright 2021 Timo Kreuzer <timo.kreuzer@reactos.org>
6 */
7
8#if !defined(_CRTBLD) && !defined(_M_IX86)
9#define _CRTBLD // we don't want inline log!
10#endif
11#include "math_helpers.h"
12
13#ifdef _MSC_VER
14#pragma function(log)
15#endif
16
17#if !defined(_M_IX86)
18#define HAS_LOGF
19#elif (defined(TEST_UCRTBASE) || defined(TEST_STATIC_CRT))
20#define HAS_LIBM_SSE2
21#endif
22
23
24// These are expected to match exactly
26{
27 { 0x0000000000000000 /* 0.000000 */, 0xfff0000000000000 /* -1.#INF00 */ },
28 { 0x8000000000000000 /* -0.000000 */, 0xfff0000000000000 /* -1.#INF00 */ },
29 { 0x7ff0000000000000 /* 1.#INF00 */, 0x7ff0000000000000 /* 1.#INF00 */ },
30 { 0x7ff0000000000001 /* 1.#SNAN0 */, 0x7ff8000000000001 /* 1.#QNAN0 */ },
31 { 0x7ff7ffffffffffff /* 1.#SNAN0 */, 0x7fffffffffffffff /* 1.#QNAN0 */ },
32 { 0x7ff8000000000000 /* 1.#QNAN0 */, 0x7ff8000000000000 /* 1.#QNAN0 */ },
33 { 0x7ff8000000000001 /* 1.#QNAN0 */, 0x7ff8000000000001 /* 1.#QNAN0 */ },
34 { 0x7fffffffffffffff /* 1.#QNAN0 */, 0x7fffffffffffffff /* 1.#QNAN0 */ },
35 { 0xfff0000000000000 /* -1.#INF00 */, 0xfff8000000000000 /* -1.#IND00 */ },
36 { 0xfff0000000000001 /* -1.#SNAN0 */, 0xfff8000000000001 /* -1.#QNAN0 */ },
37 { 0xfff7ffffffffffff /* -1.#SNAN0 */, 0xffffffffffffffff /* -1.#QNAN0 */ },
38 { 0xfff8000000000000 /* -1.#IND00 */, 0xfff8000000000000 /* -1.#IND00 */ },
39 { 0xfff8000000000001 /* -1.#QNAN0 */, 0xfff8000000000001 /* -1.#QNAN0 */ },
40 { 0xffffffffffffffff /* -1.#QNAN0 */, 0xffffffffffffffff /* -1.#QNAN0 */ },
41};
42
44{
45 for (int i = 0; i < _countof(s_log_exact_tests); i++)
46 {
47 double x = u64_to_dbl(s_log_exact_tests[i].x);
48 double z = log(x);
50 }
51}
52
53// This table is autogenerated by `python gen_math_tests.py log`
55{
56// { x, { y_rounded, y_difference } }
57 { 0x0.0p+0, { -INFINITY, 0x0.0p+0 }, 1 }, // log(0.0) == -inf
58 { 0x1.0000000000000p-54, { -0x1.2b708872320e2p+5, 0x1.570da7e077bcbp-50 }, 1 }, // log(5.551115123125783e-17) == -37.429947750237046709
59 { 0x1.0000000000000p-53, { -0x1.25e4f7b2737fap+5, -0x1.8486612173c69p-51 }, 1 }, // log(1.1102230246251565e-16) == -36.736800569677101399
60 { 0x1.8000000000000p-53, { -0x1.22a69334db8cap+5, 0x1.fe741c2356886p-49 }, 1 }, // log(1.6653345369377348e-16) == -36.331335461568937017
61 { 0x1.0000000000000p-52, { -0x1.205966f2b4f12p+5, -0x1.6dca0480f5c1ap-49 }, 1 }, // log(2.220446049250313e-16) == -36.04365338911715609
62 { 0x1.0000000000000p-52, { -0x1.205966f2b4f12p+5, -0x1.6dca0480f5c1ap-49 }, 1 }, // log(2.220446049250313e-16) == -36.04365338911715609
63 { 0x1.fae147ae147b4p-3, { -0x1.6576d89771996p+0, 0x1.6b2367eec359ap-54 }, 1 }, // log(0.24750000000000016) == -1.3963446969733913961
64 { 0x1.fae147ae147b0p-2, { -0x1.6809813f3f940p-1, -0x1.f4cfae254b1e1p-57 }, 1 }, // log(0.4950000000000001) == -0.70319751641344653528
65 { 0x1.7c28f5c28f5c3p-1, { -0x1.30e0c3b285a37p-2, 0x1.4652be2a791c4p-61 }, 1 }, // log(0.7425) == -0.29773240830528230283
66 { 0x1.fae147ae147aep-1, { -0x1.495453e6fd4bcp-7, 0x1.004bec099ed61p-61 }, 1 }, // log(0.99) == -0.010050335853501450155
67 { 0x1.0000000000000p+0, { 0x0.0p+0, 0x0.0p+0 }, 1 }, // log(1.0) == 0.0
68 { 0x1.9cccccccccccdp+1, { 0x1.2bc243071f713p+0, -0x1.5d3b2089af16bp-54 }, 1 }, // log(3.225) == 1.1709329502477358396
69 { 0x1.5cccccccccccdp+2, { 0x1.b213dd51d8cf7p+0, -0x1.6e1646938d26bp-54 }, 1 }, // log(5.45) == 1.6956156086751527395
70 { 0x1.eb33333333334p+2, { 0x1.04dc25216054cp+1, -0x1.856feeb2f10a0p-54 }, 1 }, // log(7.675000000000001) == 2.0379682934732609433
71 { 0x1.3cccccccccccdp+3, { 0x1.2571c7676e541p+1, -0x1.f06d5e1d0b8bfp-55 }, 1 }, // log(9.9) == 2.2925347571405442787
72 { 0x1.4000000000000p+3, { 0x1.26bb1bbb55516p+1, -0x1.f48ad494ea3e9p-53 }, 1 }, // log(10.0) == 2.302585092994045684
73 { 0x1.03ccccccccccdp+5, { 0x1.bd800f346f905p+1, -0x1.565ddf57f5d9fp-53 }, 1 }, // log(32.475) == 3.480470562556663279
74 { 0x1.b79999999999ap+5, { 0x1.00693edecad2ap+2, -0x1.7216b04f54ee3p-52 }, 1 }, // log(54.95) == 4.0064236808496304208
75 { 0x1.35b3333333334p+6, { 0x1.165b172e2f60bp+2, -0x1.50fae4c02bed2p-53 }, 1 }, // log(77.42500000000001) == 4.3493097258592666381
76 { 0x1.8f9999999999ap+6, { 0x1.26aab75447b9cp+2, -0x1.1d63f7498e2c0p-53 }, 1 }, // log(99.9) == 4.6041696856545078914
77 { 0x1.9000000000000p+6, { 0x1.26bb1bbb55516p+2, -0x1.f48ad494ea3e9p-52 }, 1 }, // log(100.0) == 4.605170185988091368
78 { 0x1.44f999999999ap+8, { 0x1.7228ee7245209p+2, -0x1.a2f04f5d4ed08p-54 }, 1 }, // log(324.975) == 5.7837482562940828658
79 { 0x1.12f999999999ap+9, { 0x1.93d436280608bp+2, -0x1.295b201acdffap-54 }, 1 }, // log(549.95) == 6.3098273650031257342
80 { 0x1.8376666666666p+9, { 0x1.a9c6ec186ec42p+2, -0x1.b3ae4d4a10ad7p-52 }, 1 }, // log(774.925) == 6.6527662504768741543
81 { 0x1.f3f3333333333p+9, { 0x1.ba17062572cd1p+2, 0x1.dcf9ff584ece7p-54 }, 1 }, // log(999.9) == 6.907655273981803671
82 { 0x1.f400000000000p+9, { 0x1.ba18a998fffa0p+2, 0x1.112fc120a0a22p-52 }, 1 }, // log(1000.0) == 6.9077552789821370521
83 { 0x1.963f333333333p+11, { 0x1.02c3cf5986f16p+3, -0x1.0146d3dc95d77p-54 }, 1 }, // log(3249.975) == 8.0864025829865048831
84 { 0x1.57bf333333333p+12, { 0x1.13998d9ad7ea4p+3, 0x1.17cbe4d7073dbp-51 }, 1 }, // log(5499.95) == 8.61249428027014878
85 { 0x1.e45ecccccccccp+12, { 0x1.1e92f3a543639p+3, -0x1.7aea9895e962dp-51 }, 1 }, // log(7749.924999999999) == 8.9554384448812112218
86 { 0x1.387f333333333p+13, { 0x1.26bb06c298e94p+3, -0x1.a184e48cc9dcep-51 }, 1 }, // log(9999.9) == 9.2103303719261823664
87 { 0x1.3880000000000p+13, { 0x1.26bb1bbb55516p+3, -0x1.f48ad494ea3e9p-51 }, 1 }, // log(10000.0) == 9.2103403719761827361
88 { 0x1.fbcfe66666666p+14, { 0x1.4c72a4cd2cbecp+3, -0x1.b6e191bd86b8ap-51 }, 1 }, // log(32499.975) == 10.38899459908676372
89 { 0x1.adafe66666666p+15, { 0x1.5d4865b247654p+3, -0x1.79fa441590cbcp-53 }, 1 }, // log(54999.95) == 10.915087555123285604
90 { 0x1.2ebbeccccccccp+16, { 0x1.6841ccd8180a1p+3, -0x1.a16a49d872729p-53 }, 1 }, // log(77499.92499999999) == 11.258032247599034467
91 { 0x1.869fe66666666p+16, { 0x1.7069e0914ba00p+3, -0x1.49cb0ada4816cp-54 }, 1 }, // log(99999.9) == 11.512924464969728362
92 { 0x1.86a0000000000p+16, { 0x1.7069e2aa2aa5bp+3, -0x1.c6b626e89338fp-53 }, 1 }, // log(100000.0) == 11.51292546497022842
93 { 0x1.3d61fe6666666p+18, { 0x1.96216d2fb028dp+3, -0x1.4a1b6c37833e3p-54 }, 1 }, // log(324999.975) == 12.691580384388794584
94 { 0x1.0c8dfe6666666p+19, { 0x1.a6f72e585ed58p+3, 0x1.238a6451023e9p-59 }, 1 }, // log(549999.95) == 13.217673466299558529
95 { 0x1.7a6afd999999ap+19, { 0x1.b1f0959a8653dp+3, 0x1.ee045aad44facp-53 }, 1 }, // log(774999.925) == 13.560618211561285876
96 { 0x1.e847fcccccccdp+19, { 0x1.ba18a9635014ap+3, 0x1.f7d919c172239p-53 }, 1 }, // log(999999.9) == 13.815510457964269127
97};
98
100{
101 for (int i = 0; i < _countof(s_log_approx_tests); i++)
102 {
103 double x = s_log_approx_tests[i].x;
105 double z = log(x);
107 ok(error <= s_log_approx_tests[i].max_error,
108 "log(%.17e) = %.17e, expected %.17e, error %I64d ULPs, max %u ULPs\n",
109 x, z, expected, error, s_log_approx_tests[i].max_error);
110 }
111}
112
113#if defined(HAS_LOGF)
114
115// These are expected to match exactly
117{
118 { 0x00000000 /* 0.000000 */, 0xff800000 /* -1.#IND00 */ },
119 { 0x80000000 /* -0.000000 */, 0xff800000 /* -1.#IND00 */ },
120 { 0x7f800000 /* 1.#INF00 */, 0xff800000 /* -1.#IND00 */ },
121 { 0x7f800001 /* 1.#SNAN0 */, 0xff800000 /* -1.#IND00 */ },
122 { 0x7fBFffff /* 1.#SNAN0 */, 0xff800000 /* -1.#IND00 */ },
123 { 0x7fC00000 /* 1.#QNAN0 */, 0xff800000 /* -1.#IND00 */ },
124 { 0x7fC80001 /* 1.#QNAN0 */, 0xff800000 /* -1.#IND00 */ },
125 { 0x7fFfffff /* 1.#QNAN0 */, 0xff800000 /* -1.#IND00 */ },
126 { 0xff800000 /* -1.#INF00 */, 0xff800000 /* -1.#IND00 */ },
127 { 0xff800001 /* -1.#SNAN0 */, 0xff800000 /* -1.#IND00 */ },
128 { 0xffBfffff /* -1.#SNAN0 */, 0xff800000 /* -1.#IND00 */ },
129 { 0xffC00000 /* -1.#IND00 */, 0xff800000 /* -1.#IND00 */ },
130 { 0xfff80001 /* -1.#QNAN0 */, 0xff800000 /* -1.#IND00 */ },
131 { 0xffffffff /* -1.#QNAN0 */, 0xff800000 /* -1.#IND00 */ },
132};
133
135{
136 for (int i = 0; i < _countof(s_logf_exact_tests); i++)
137 {
139 float z = logf(x);
141 }
142}
143
144#endif // defined(HAS_LOGF)
145
146#if defined(HAS_LOGF) || defined(HAS_LIBM_SSE2)
147
149{
150// { x, { y_rounded, y_difference } }
151 { 0x0.0p+0, { -INFINITY, 0x0.0p+0 }, 1 }, // logf(0.0) == -inf
152 { 0x1.0000000000000p-54, { -0x1.2b708872320e2p+5, 0x1.570da7e077bcbp-50 }, 1 }, // logf(5.551115123125783e-17) == -37.429947750237046709
153 { 0x1.0000000000000p-53, { -0x1.25e4f7b2737fap+5, -0x1.8486612173c69p-51 }, 1 }, // logf(1.1102230246251565e-16) == -36.736800569677101399
154 { 0x1.8000000000000p-53, { -0x1.22a69334db8cap+5, 0x1.fe741c2356886p-49 }, 1 }, // logf(1.6653345369377348e-16) == -36.331335461568937017
155 { 0x1.0000000000000p-52, { -0x1.205966f2b4f12p+5, -0x1.6dca0480f5c1ap-49 }, 1 }, // logf(2.220446049250313e-16) == -36.04365338911715609
156 { 0x1.0000000000000p-52, { -0x1.205966f2b4f12p+5, -0x1.6dca0480f5c1ap-49 }, 1 }, // logf(2.220446049250313e-16) == -36.04365338911715609
157 { 0x1.fae1480000000p-3, { -0x1.6576d86e11ec5p+0, 0x1.91c3b0fd30d0ap-55 }, 1 }, // logf(0.2475000023841858) == -1.3963446873403182033
158 { 0x1.fae1480000000p-2, { -0x1.680980ec8039ap-1, -0x1.98575d29032d6p-55 }, 1 }, // logf(0.4950000047683716) == -0.70319750678037289391
159 { 0x1.7c28f60000000p-1, { -0x1.30e0c30d06ee9p-2, 0x1.3456f70f6d4cfp-57 }, 1 }, // logf(0.7425000071525574) == -0.29773239867220851193
160 { 0x1.fae1480000000p-1, { -0x1.49543f3726accp-7, -0x1.3935a79b95b74p-62 }, 1 }, // logf(0.9900000095367432) == -0.010050326220427584488
161 { 0x1.0000000000000p+0, { 0x0.0p+0, 0x0.0p+0 }, 1 }, // logf(1.0) == 0.0
162 { 0x1.9ccccc0000000p+1, { 0x1.2bc242881d750p+0, 0x1.1d6fb8e6a245fp-56 }, 1 }, // logf(3.2249999046325684) == 1.170932920676438742
163 { 0x1.5ccccc0000000p+2, { 0x1.b213dcbb88f4dp+0, -0x1.dea013e90f530p-59 }, 1 }, // logf(5.449999809265137) == 1.6956155736779294741
164 { 0x1.eb33340000000p+2, { 0x1.04dc2556be8f1p+1, -0x1.3889309954fc2p-54 }, 1 }, // logf(7.675000190734863) == 2.0379683183247085265
165 { 0x1.3ccccc0000000p+3, { 0x1.2571c714aef97p+1, 0x1.74e57ea15fc01p-56 }, 1 }, // logf(9.899999618530273) == 2.2925347186082478881
166 { 0x1.4000000000000p+3, { 0x1.26bb1bbb55516p+1, -0x1.f48ad494ea3e9p-53 }, 1 }, // logf(10.0) == 2.302585092994045684
167 { 0x1.03cccc0000000p+5, { 0x1.bd800ecf88977p+1, -0x1.00574318b416bp-53 }, 1 }, // logf(32.474998474121094) == 3.4804705155703986595
168 { 0x1.b7999a0000000p+5, { 0x1.00693eedb34bcp+2, -0x1.e6ce0b58a27a3p-52 }, 1 }, // logf(54.95000076293945) == 4.0064236947338787372
169 { 0x1.35b3340000000p+6, { 0x1.165b175881df7p+2, -0x1.86e3584bdefbfp-52 }, 1 }, // logf(77.42500305175781) == 4.349309765274930067
170 { 0x1.8f999a0000000p+6, { 0x1.26aab764ae3a6p+2, -0x1.5a1bcef3f1fc9p-54 }, 1 }, // logf(99.9000015258789) == 4.6041697009285708435
171 { 0x1.9000000000000p+6, { 0x1.26bb1bbb55516p+2, -0x1.f48ad494ea3e9p-52 }, 1 }, // logf(100.0) == 4.605170185988091368
172 { 0x1.44f99a0000000p+8, { 0x1.7228ee866fbeap+2, -0x1.82c647dd35ef4p-52 }, 1 }, // logf(324.9750061035156) == 5.7837482750755754266
173 { 0x1.12f99a0000000p+9, { 0x1.93d4363fdb64fp+2, 0x1.ced38fcf71228p-54 }, 1 }, // logf(549.9500122070312) == 6.3098273871997455524
174 { 0x1.8376660000000p+9, { 0x1.a9c6ec0784be3p+2, -0x1.81f6991b45131p-52 }, 1 }, // logf(774.9249877929688) == 6.6527662347243415858
175 { 0x1.f3f3340000000p+9, { 0x1.ba17063faa5bdp+2, -0x1.c7de7e4907292p-52 }, 1 }, // logf(999.9000244140625) == 6.9076552983983075461
176 { 0x1.f400000000000p+9, { 0x1.ba18a998fffa0p+2, 0x1.112fc120a0a22p-52 }, 1 }, // logf(1000.0) == 6.9077552789821370521
177 { 0x1.963f340000000p+11, { 0x1.02c3cf69a8c03p+3, 0x1.6bb1cffd7187cp-51 }, 1 }, // logf(3249.97509765625) == 8.0864026130348125235
178 { 0x1.57bf340000000p+12, { 0x1.13998dade89aap+3, 0x1.72bccaa5b2944p-52 }, 1 }, // logf(5499.9501953125) == 8.6124943157818346525
179 { 0x1.e45ecc0000000p+12, { 0x1.1e92f397bbac0p+3, 0x1.96494797afa2bp-51 }, 1 }, // logf(7749.9248046875) == 8.9554384196793542059
180 { 0x1.387f340000000p+13, { 0x1.26bb06d791ac8p+3, -0x1.6d467014735b7p-51 }, 1 }, // logf(9999.900390625) == 9.2103304109890722687
181 { 0x1.3880000000000p+13, { 0x1.26bb1bbb55516p+3, -0x1.f48ad494ea3e9p-51 }, 1 }, // logf(10000.0) == 9.2103403719761827361
182 { 0x1.fbcfe60000000p+14, { 0x1.4c72a4c6b8d55p+3, -0x1.9e0b13b1785a9p-54 }, 1 }, // logf(32499.974609375) == 10.388994587067523677
183 { 0x1.adafe60000000p+15, { 0x1.5d4865aaa722cp+3, 0x1.a30667e00ed9fp-51 }, 1 }, // logf(54999.94921875) == 10.915087540918727188
184 { 0x1.2ebbec0000000p+16, { 0x1.6841ccc272240p+3, -0x1.5a8336cde266cp-51 }, 1 }, // logf(77499.921875) == 11.258032207276414137
185 { 0x1.869fe60000000p+16, { 0x1.7069e088e823ap+3, 0x1.b00c7a015b382p-53 }, 1 }, // logf(99999.8984375) == 11.512924449344712673
186 { 0x1.86a0000000000p+16, { 0x1.7069e2aa2aa5bp+3, -0x1.c6b626e89338fp-53 }, 1 }, // logf(100000.0) == 11.51292546497022842
187 { 0x1.3d61fe0000000p+18, { 0x1.96216d255d1a3p+3, 0x1.ae8b7c6267831p-51 }, 1 }, // logf(324999.96875) == 12.691580365158023761
188 { 0x1.0c8dfe0000000p+19, { 0x1.a6f72e4c2b38ap+3, -0x1.882333e3ef043p-51 }, 1 }, // logf(549999.9375) == 13.217673443572283562
189 { 0x1.7a6afe0000000p+19, { 0x1.b1f095a32f15cp+3, -0x1.31d7e7cd304bdp-52 }, 1 }, // logf(774999.9375) == 13.560618227690319505
190 { 0x1.e847fc0000000p+19, { 0x1.ba18a955e41b4p+3, -0x1.3c5765dc7b756p-51 }, 1 }, // logf(999999.875) == 13.815510432964266292
191};
192
193#endif // defined(HAS_LOGF) || defined(HAS_LIBM_SSE2)
194
195#if defined(HAS_LOGF)
196
198{
199 for (int i = 0; i < _countof(s_logf_approx_tests); i++)
200 {
201 float x = s_logf_approx_tests[i].x;
203 float z = logf(x);
205 ok(error <= s_log_approx_tests[i].max_error,
206 "log(%.6e) = %.7e, expected %.7e, error %I64d ULPs, max %u ULPs\n",
207 x, z, expected, error, s_log_approx_tests[i].max_error);
208 }
209}
210
211#endif // defined(HAS_LOGF)
212
213#if defined(HAS_LIBM_SSE2)
214
215__ATTRIBUTE_SSE2__ __m128d __libm_sse2_log(__m128d Xmm0);
216
218void Test_libm_sse2_log(void)
219{
220 int i;
221 for (i = 0; i < _countof(s_log_approx_tests); i++)
222 {
223 double x = s_log_approx_tests[i].x;
225 __m128d xmm0 = _mm_set_sd(x);
226 __m128d xmm1 = __libm_sse2_log(xmm0);
227 double z = _mm_cvtsd_f64(xmm1);
229 ok(error <= s_log_approx_tests[i].max_error,
230 "__libm_sse2_log(%.17e) = %.17e, expected %.17e, error %I64d ULPs, max %u ULPs\n",
231 x, z, expected, error, s_log_approx_tests[i].max_error);
232 }
233}
234
235__ATTRIBUTE_SSE2__ __m128 __libm_sse2_logf(__m128 Xmm0);
236
238void Test_libm_sse2_logf(void)
239{
240 int i;
241 for (i = 0; i < _countof(s_logf_approx_tests); i++)
242 {
243 float x = s_logf_approx_tests[i].x;
245 __m128 xmm0 = _mm_set_ps1(x);
246 __m128 xmm1 = __libm_sse2_logf(xmm0);
247 float z = _mm_cvtss_f32(xmm1);
249 ok(error <= s_logf_approx_tests[i].max_error,
250 "__libm_sse2_logf(%.6e) = %.7e, expected %.7e, error %I64d ULPs, max %u ULPs\n",
251 x, z, expected, error, s_logf_approx_tests[i].max_error);
252 }
253}
254
255#endif // defined(HAS_LIBM_SSE2)
256
258{
261#if defined(HAS_LOGF)
264#endif
265#if defined(HAS_LIBM_SSE2)
266 Test_libm_sse2_log();
267 Test_libm_sse2_logf();
268#endif
269}
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
INT64 int64_t
Definition: types.h:72
__m128d _mm_set_sd(double w)
Definition: emmintrin.h:1037
double _mm_cvtsd_f64(__m128d a)
Definition: emmintrin.h:931
#define abs(i)
Definition: fconv.c:206
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLuint64EXT * result
Definition: glext.h:11304
GLdouble GLdouble z
Definition: glext.h:5874
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Check_return_ float __cdecl logf(_In_ float x)
Definition: math.h:243
#define INFINITY
Definition: math.h:56
__ATTRIBUTE_SSE2__ __m128 __libm_sse2_logf(__m128 Xmm0)
Definition: libm_sse2.c:118
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_log(__m128d Xmm0)
Definition: libm_sse2.c:111
#define ok_eq_dbl_exact(func, ullx, z, ullexp)
Definition: math_helpers.h:184
static __inline double u64_to_dbl(UINT64 x)
Definition: math_helpers.h:25
#define __ATTRIBUTE_SSE2__
Definition: math_helpers.h:19
static __inline int64_t ulp_error_precise(PRECISE_VALUE *expected, double result)
Definition: math_helpers.h:154
static __inline int ulp_error_flt(float expected, float result)
Definition: math_helpers.h:138
#define ok_eq_flt_exact(func, ux, z, uexp)
Definition: math_helpers.h:194
#define error(str)
Definition: mkdosfs.c:1605
void Test_log_exact(void)
Definition: log.c:43
static TESTENTRY_DBL_APPROX s_log_approx_tests[]
Definition: log.c:54
static TESTENTRY_DBL s_logf_exact_tests[]
Definition: log.c:116
void Test_logf_exact(void)
Definition: log.c:134
void Test_logf_approx(void)
Definition: log.c:197
static TESTENTRY_DBL s_log_exact_tests[]
Definition: log.c:25
static TESTENTRY_DBL_APPROX s_logf_approx_tests[]
Definition: log.c:148
void Test_log_approx(void)
Definition: log.c:99
BOOL expected
Definition: store.c:2000
#define log(outFile, fmt,...)
Definition: util.h:15
#define _countof(array)
Definition: sndvol32.h:70
PRECISE_VALUE expected
Definition: math_helpers.h:87
float _mm_cvtss_f32(__m128 a)
Definition: xmmintrin.h:921
__m128 _mm_set_ps1(float a)