Skip to content

Conversation

@jangorecki
Copy link
Member

Closes #7546

Haven't tested, but looking at

Fri Dec 26 02:23:49 2025 endian==little, sizeof(long double)==16, capabilities('long.double')==TRUE, longdouble.digits==53, sizeof(pointer)==8, TZ==unset,

and

exact_NaN = isTRUE(capabilities()["long.double"]) && identical(as.integer(.Machine$longdouble.digits), 64L)

I think it should do

exact_NaN = isTRUE(capabilities()["long.double"]) && identical(as.integer(.Machine$longdouble.digits), 64L)
if (!exact_NaN) {
cat("\n**** Skipping 7 NaN/NA algo='exact' tests because .Machine$longdouble.digits==", .Machine$longdouble.digits, " (!=64); e.g. under valgrind\n\n", sep="")
cat("\n**** Skipping 8 NaN/NA algo='exact' tests because .Machine$longdouble.digits==", .Machine$longdouble.digits, " (!=64); e.g. under valgrind\n\n", sep="")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we could do something like nskip for foreign messages to avoid incrementing this manually

if (foreign && nskip > 0L) catf("Skipped %d tests for translated messages. ", nskip) # nocov

@codecov
Copy link

codecov bot commented Dec 29, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.96%. Comparing base (291a711) to head (c524ccf).
⚠️ Report is 2 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #7548      +/-   ##
==========================================
- Coverage   98.97%   98.96%   -0.02%     
==========================================
  Files          87       87              
  Lines       16733    16737       +4     
==========================================
+ Hits        16561    16563       +2     
- Misses        172      174       +2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

y = c(1e8+2.980232e-8, 1e8, 1e8, 1e8) # CLAMP0 test
test(6001.731, frollvar(y, 3)[4L], 0)
test(6001.732, frollsd(y, 3)[4L], 0)
if (exact_NaN) test(6001.732, frollsd(y, 3)[4L], 0)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the other cases are all using algo='exact', so this would be the first case being skipped with algo='fast'

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's also v. interesting that frollvar(y, 3)[4L], which per glancing the implementation only differs by applying sqrt(), does not have this numerical difference issue

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, sqrt must be causing this rounding error

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could possibly use all.equal here instead... Then no need to escape test

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any idea why 2.980232e-8 was chosen? Maybe we could make that a function of .Machine$double.eps (assuming that changes on/off valgrind) or of .Machine$longdouble.digits?

Copy link
Member

@MichaelChirico MichaelChirico Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like the CLAMP0 in the comment refers to something that was refactored...

#7361 (comment)

c2c5bde#diff-6eb444de657f71e8b89b3d686c4ec70e4ecff4e33154481d0b1b416d09449f1eL1140

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems @ben-schwen came up with that number:

#7361 (comment)

Copy link
Member

@ben-schwen ben-schwen Dec 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2.980232e-8 was chosen because without clamp, it produced wrong results. AFAIR I used rnorm with e-16 or smth and pushed onto frollsd until I found the example (with 3 or 4 other candidates) because the code looked numerically unstable (hitting negative numbers).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the extra context, very helpful. I did a similar exercise (with rnorm(1e6, sd=1e-8) to be precise) and found that, absent the clamping added in #7361, we can trigger the negative result on valgrind with a different epsilon:

y = c(1e8-0.000000017353503836151923775668, 1e8, 1e8, 1e8)
frollvar(y, 3)
# [1]            NA            NA  0.000000e+00 -1.110223e-16

But it does seem prohibitively difficult to come up with an epsilon that fails with and without valgrind, and I'm not sure there's anything but cleverness points to score there anyway.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could possibly use all.equal here instead... Then no need to escape test

wound up doing essentially this, but all.equal() won't do because the intent of the test is to ensure the result is strictly non-negative.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

valgrind issue in 1.18.0

3 participants