round: Bypass the precision logic when rounding to 0 places - #12284

Open
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero
Open

round: Bypass the precision logic when rounding to 0 places#12284
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero

Conversation

@TimWolla

Copy link
Copy Markdown
Member

Since GH-12220 the implementation of php_round_helper(), which performs rounding to an integral value, is easy to verify for correctness up to the floating point precision.

If rounding to 0 places is desired, i.e. the userland round() function is called with $precision = 0, we bypass all logic for the decimal point adjustment and instead directly call php_round_helper().

This change fixes the remaining two cases of GH-12143 and likely guarantees correct rounding for all possible inputs and $precision = 0.

/cc @SakiTakamachi

Since phpGH-12220 the implementation of `php_round_helper()`, which performs
rounding to an integral value, is easy to verify for correctness up to the
floating point precision.
If rounding to 0 places is desired, i.e. the userland `round()` function is
called with `$precision = 0`, we bypass all logic for the decimal point
adjustment and instead directly call `php_round_helper()`.
This change fixes the remaining two cases of phpGH-12143 and likely guarantees
correct rounding for all possible inputs and `$precision = 0`.
@SakiTakamachi

Copy link
Copy Markdown
Member

I haven't tried it yet, so this is just a prediction, but I think the results will be incorrect in the following cases.

round(1.700000000000145, 13, PHP_ROUND_HALF_UP);
round(1.550000000000001, 1, PHP_ROUND_HALF_DOWN)

@TimWolla

Copy link
Copy Markdown
MemberAuthor

but I think the results will be incorrect in the following cases.

These cases are not handled by this PR. It only handles the case where the second parameter is 0, i.e. integer rounding is desired. This is the case we can do exactly up to floating point precision.

@SakiTakamachi

Copy link
Copy Markdown
Member

Ah, I understand.

I cannot agree to this change.
Is there really any point in changing only the behavior when precision is 0?

Rounding to the 16th digit is not included as it is a functional modification, but all other cases can be fixed with my changes.
(There may be room for discussion on how to handle edge cases, but it would be a good idea to make some changes depending on the discussion.)

#12268

And bypassing processing when precision is 0 as a way to make the 16th digit possible is completely wrong.

@Girgias

Copy link
Copy Markdown
Member

This looks sensible? But I must say the precision adjustment code is quite confusing (probably due to the extremely generic variable names...).

But overhaul, shouldn't possible issues only be present when using strictly positive precisions? And it seems like it tries to handle those before delegating to the round helper. (Point being I don't totally understand why negative precisions, which will round to an integer value, seems to use the same logic as something rounding to a float val).

@bukka

Copy link
Copy Markdown
Member

I would prefer to see more complete solution to handle all cases which is either #12268 or #12291 .

@jorgsowa

Copy link
Copy Markdown
Contributor

Hi @TimWolla, will you continue this PR?

@Girgias

Copy link
Copy Markdown
Member

I don't think this PR is still relevant considering the various round() RFCs. Can this be closed @TimWolla ?

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TimWolla@SakiTakamachi@Girgias@bukka@jorgsowa
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

round: Bypass the precision logic when rounding to 0 places - #12284

Open
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero
Open

round: Bypass the precision logic when rounding to 0 places#12284
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero

Conversation

@TimWolla

Copy link
Copy Markdown
Member

Since GH-12220 the implementation of php_round_helper(), which performs rounding to an integral value, is easy to verify for correctness up to the floating point precision.

If rounding to 0 places is desired, i.e. the userland round() function is called with $precision = 0, we bypass all logic for the decimal point adjustment and instead directly call php_round_helper().

This change fixes the remaining two cases of GH-12143 and likely guarantees correct rounding for all possible inputs and $precision = 0.

/cc @SakiTakamachi

Since phpGH-12220 the implementation of `php_round_helper()`, which performs
rounding to an integral value, is easy to verify for correctness up to the
floating point precision.
If rounding to 0 places is desired, i.e. the userland `round()` function is
called with `$precision = 0`, we bypass all logic for the decimal point
adjustment and instead directly call `php_round_helper()`.
This change fixes the remaining two cases of phpGH-12143 and likely guarantees
correct rounding for all possible inputs and `$precision = 0`.
@SakiTakamachi

Copy link
Copy Markdown
Member

I haven't tried it yet, so this is just a prediction, but I think the results will be incorrect in the following cases.

round(1.700000000000145, 13, PHP_ROUND_HALF_UP);
round(1.550000000000001, 1, PHP_ROUND_HALF_DOWN)

@TimWolla

Copy link
Copy Markdown
MemberAuthor

but I think the results will be incorrect in the following cases.

These cases are not handled by this PR. It only handles the case where the second parameter is 0, i.e. integer rounding is desired. This is the case we can do exactly up to floating point precision.

@SakiTakamachi

Copy link
Copy Markdown
Member

Ah, I understand.

I cannot agree to this change.
Is there really any point in changing only the behavior when precision is 0?

Rounding to the 16th digit is not included as it is a functional modification, but all other cases can be fixed with my changes.
(There may be room for discussion on how to handle edge cases, but it would be a good idea to make some changes depending on the discussion.)

#12268

And bypassing processing when precision is 0 as a way to make the 16th digit possible is completely wrong.

@Girgias

Copy link
Copy Markdown
Member

This looks sensible? But I must say the precision adjustment code is quite confusing (probably due to the extremely generic variable names...).

But overhaul, shouldn't possible issues only be present when using strictly positive precisions? And it seems like it tries to handle those before delegating to the round helper. (Point being I don't totally understand why negative precisions, which will round to an integer value, seems to use the same logic as something rounding to a float val).

@bukka

Copy link
Copy Markdown
Member

I would prefer to see more complete solution to handle all cases which is either #12268 or #12291 .

@jorgsowa

Copy link
Copy Markdown
Contributor

Hi @TimWolla, will you continue this PR?

@Girgias

Copy link
Copy Markdown
Member

I don't think this PR is still relevant considering the various round() RFCs. Can this be closed @TimWolla ?

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TimWolla@SakiTakamachi@Girgias@bukka@jorgsowa
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

round: Bypass the precision logic when rounding to 0 places - #12284

Open
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero
Open

round: Bypass the precision logic when rounding to 0 places#12284
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero

Conversation

@TimWolla

Copy link
Copy Markdown
Member

Since GH-12220 the implementation of php_round_helper(), which performs rounding to an integral value, is easy to verify for correctness up to the floating point precision.

If rounding to 0 places is desired, i.e. the userland round() function is called with $precision = 0, we bypass all logic for the decimal point adjustment and instead directly call php_round_helper().

This change fixes the remaining two cases of GH-12143 and likely guarantees correct rounding for all possible inputs and $precision = 0.

/cc @SakiTakamachi

Since phpGH-12220 the implementation of `php_round_helper()`, which performs
rounding to an integral value, is easy to verify for correctness up to the
floating point precision.
If rounding to 0 places is desired, i.e. the userland `round()` function is
called with `$precision = 0`, we bypass all logic for the decimal point
adjustment and instead directly call `php_round_helper()`.
This change fixes the remaining two cases of phpGH-12143 and likely guarantees
correct rounding for all possible inputs and `$precision = 0`.
@SakiTakamachi

Copy link
Copy Markdown
Member

I haven't tried it yet, so this is just a prediction, but I think the results will be incorrect in the following cases.

round(1.700000000000145, 13, PHP_ROUND_HALF_UP);
round(1.550000000000001, 1, PHP_ROUND_HALF_DOWN)

@TimWolla

Copy link
Copy Markdown
MemberAuthor

but I think the results will be incorrect in the following cases.

These cases are not handled by this PR. It only handles the case where the second parameter is 0, i.e. integer rounding is desired. This is the case we can do exactly up to floating point precision.

@SakiTakamachi

Copy link
Copy Markdown
Member

Ah, I understand.

I cannot agree to this change.
Is there really any point in changing only the behavior when precision is 0?

Rounding to the 16th digit is not included as it is a functional modification, but all other cases can be fixed with my changes.
(There may be room for discussion on how to handle edge cases, but it would be a good idea to make some changes depending on the discussion.)

#12268

And bypassing processing when precision is 0 as a way to make the 16th digit possible is completely wrong.

@Girgias

Copy link
Copy Markdown
Member

This looks sensible? But I must say the precision adjustment code is quite confusing (probably due to the extremely generic variable names...).

But overhaul, shouldn't possible issues only be present when using strictly positive precisions? And it seems like it tries to handle those before delegating to the round helper. (Point being I don't totally understand why negative precisions, which will round to an integer value, seems to use the same logic as something rounding to a float val).

@bukka

Copy link
Copy Markdown
Member

I would prefer to see more complete solution to handle all cases which is either #12268 or #12291 .

@jorgsowa

Copy link
Copy Markdown
Contributor

Hi @TimWolla, will you continue this PR?

@Girgias

Copy link
Copy Markdown
Member

I don't think this PR is still relevant considering the various round() RFCs. Can this be closed @TimWolla ?

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TimWolla@SakiTakamachi@Girgias@bukka@jorgsowa
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

round: Bypass the precision logic when rounding to 0 places - #12284

Open
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero
Open

round: Bypass the precision logic when rounding to 0 places#12284
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero

Conversation

@TimWolla

Copy link
Copy Markdown
Member

Since GH-12220 the implementation of php_round_helper(), which performs rounding to an integral value, is easy to verify for correctness up to the floating point precision.

If rounding to 0 places is desired, i.e. the userland round() function is called with $precision = 0, we bypass all logic for the decimal point adjustment and instead directly call php_round_helper().

This change fixes the remaining two cases of GH-12143 and likely guarantees correct rounding for all possible inputs and $precision = 0.

/cc @SakiTakamachi

Since phpGH-12220 the implementation of `php_round_helper()`, which performs
rounding to an integral value, is easy to verify for correctness up to the
floating point precision.
If rounding to 0 places is desired, i.e. the userland `round()` function is
called with `$precision = 0`, we bypass all logic for the decimal point
adjustment and instead directly call `php_round_helper()`.
This change fixes the remaining two cases of phpGH-12143 and likely guarantees
correct rounding for all possible inputs and `$precision = 0`.
@SakiTakamachi

Copy link
Copy Markdown
Member

I haven't tried it yet, so this is just a prediction, but I think the results will be incorrect in the following cases.

round(1.700000000000145, 13, PHP_ROUND_HALF_UP);
round(1.550000000000001, 1, PHP_ROUND_HALF_DOWN)

@TimWolla

Copy link
Copy Markdown
MemberAuthor

but I think the results will be incorrect in the following cases.

These cases are not handled by this PR. It only handles the case where the second parameter is 0, i.e. integer rounding is desired. This is the case we can do exactly up to floating point precision.

@SakiTakamachi

Copy link
Copy Markdown
Member

Ah, I understand.

I cannot agree to this change.
Is there really any point in changing only the behavior when precision is 0?

Rounding to the 16th digit is not included as it is a functional modification, but all other cases can be fixed with my changes.
(There may be room for discussion on how to handle edge cases, but it would be a good idea to make some changes depending on the discussion.)

#12268

And bypassing processing when precision is 0 as a way to make the 16th digit possible is completely wrong.

@Girgias

Copy link
Copy Markdown
Member

This looks sensible? But I must say the precision adjustment code is quite confusing (probably due to the extremely generic variable names...).

But overhaul, shouldn't possible issues only be present when using strictly positive precisions? And it seems like it tries to handle those before delegating to the round helper. (Point being I don't totally understand why negative precisions, which will round to an integer value, seems to use the same logic as something rounding to a float val).

@bukka

Copy link
Copy Markdown
Member

I would prefer to see more complete solution to handle all cases which is either #12268 or #12291 .

@jorgsowa

Copy link
Copy Markdown
Contributor

Hi @TimWolla, will you continue this PR?

@Girgias

Copy link
Copy Markdown
Member

I don't think this PR is still relevant considering the various round() RFCs. Can this be closed @TimWolla ?

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TimWolla@SakiTakamachi@Girgias@bukka@jorgsowa
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

round: Bypass the precision logic when rounding to 0 places - #12284

Open
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero
Open

round: Bypass the precision logic when rounding to 0 places#12284
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero

Conversation

@TimWolla

Copy link
Copy Markdown
Member

Since GH-12220 the implementation of php_round_helper(), which performs rounding to an integral value, is easy to verify for correctness up to the floating point precision.

If rounding to 0 places is desired, i.e. the userland round() function is called with $precision = 0, we bypass all logic for the decimal point adjustment and instead directly call php_round_helper().

This change fixes the remaining two cases of GH-12143 and likely guarantees correct rounding for all possible inputs and $precision = 0.

/cc @SakiTakamachi

Since phpGH-12220 the implementation of `php_round_helper()`, which performs
rounding to an integral value, is easy to verify for correctness up to the
floating point precision.
If rounding to 0 places is desired, i.e. the userland `round()` function is
called with `$precision = 0`, we bypass all logic for the decimal point
adjustment and instead directly call `php_round_helper()`.
This change fixes the remaining two cases of phpGH-12143 and likely guarantees
correct rounding for all possible inputs and `$precision = 0`.
@SakiTakamachi

Copy link
Copy Markdown
Member

I haven't tried it yet, so this is just a prediction, but I think the results will be incorrect in the following cases.

round(1.700000000000145, 13, PHP_ROUND_HALF_UP);
round(1.550000000000001, 1, PHP_ROUND_HALF_DOWN)

@TimWolla

Copy link
Copy Markdown
MemberAuthor

but I think the results will be incorrect in the following cases.

These cases are not handled by this PR. It only handles the case where the second parameter is 0, i.e. integer rounding is desired. This is the case we can do exactly up to floating point precision.

@SakiTakamachi

Copy link
Copy Markdown
Member

Ah, I understand.

I cannot agree to this change.
Is there really any point in changing only the behavior when precision is 0?

Rounding to the 16th digit is not included as it is a functional modification, but all other cases can be fixed with my changes.
(There may be room for discussion on how to handle edge cases, but it would be a good idea to make some changes depending on the discussion.)

#12268

And bypassing processing when precision is 0 as a way to make the 16th digit possible is completely wrong.

@Girgias

Copy link
Copy Markdown
Member

This looks sensible? But I must say the precision adjustment code is quite confusing (probably due to the extremely generic variable names...).

But overhaul, shouldn't possible issues only be present when using strictly positive precisions? And it seems like it tries to handle those before delegating to the round helper. (Point being I don't totally understand why negative precisions, which will round to an integer value, seems to use the same logic as something rounding to a float val).

@bukka

Copy link
Copy Markdown
Member

I would prefer to see more complete solution to handle all cases which is either #12268 or #12291 .

@jorgsowa

Copy link
Copy Markdown
Contributor

Hi @TimWolla, will you continue this PR?

@Girgias

Copy link
Copy Markdown
Member

I don't think this PR is still relevant considering the various round() RFCs. Can this be closed @TimWolla ?

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TimWolla@SakiTakamachi@Girgias@bukka@jorgsowa
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

round: Bypass the precision logic when rounding to 0 places - #12284

Open
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero
Open

round: Bypass the precision logic when rounding to 0 places#12284
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero

Conversation

@TimWolla

Copy link
Copy Markdown
Member

Since GH-12220 the implementation of php_round_helper(), which performs rounding to an integral value, is easy to verify for correctness up to the floating point precision.

If rounding to 0 places is desired, i.e. the userland round() function is called with $precision = 0, we bypass all logic for the decimal point adjustment and instead directly call php_round_helper().

This change fixes the remaining two cases of GH-12143 and likely guarantees correct rounding for all possible inputs and $precision = 0.

/cc @SakiTakamachi

Since phpGH-12220 the implementation of `php_round_helper()`, which performs
rounding to an integral value, is easy to verify for correctness up to the
floating point precision.
If rounding to 0 places is desired, i.e. the userland `round()` function is
called with `$precision = 0`, we bypass all logic for the decimal point
adjustment and instead directly call `php_round_helper()`.
This change fixes the remaining two cases of phpGH-12143 and likely guarantees
correct rounding for all possible inputs and `$precision = 0`.
@SakiTakamachi

Copy link
Copy Markdown
Member

I haven't tried it yet, so this is just a prediction, but I think the results will be incorrect in the following cases.

round(1.700000000000145, 13, PHP_ROUND_HALF_UP);
round(1.550000000000001, 1, PHP_ROUND_HALF_DOWN)

@TimWolla

Copy link
Copy Markdown
MemberAuthor

but I think the results will be incorrect in the following cases.

These cases are not handled by this PR. It only handles the case where the second parameter is 0, i.e. integer rounding is desired. This is the case we can do exactly up to floating point precision.

@SakiTakamachi

Copy link
Copy Markdown
Member

Ah, I understand.

I cannot agree to this change.
Is there really any point in changing only the behavior when precision is 0?

Rounding to the 16th digit is not included as it is a functional modification, but all other cases can be fixed with my changes.
(There may be room for discussion on how to handle edge cases, but it would be a good idea to make some changes depending on the discussion.)

#12268

And bypassing processing when precision is 0 as a way to make the 16th digit possible is completely wrong.

@Girgias

Copy link
Copy Markdown
Member

This looks sensible? But I must say the precision adjustment code is quite confusing (probably due to the extremely generic variable names...).

But overhaul, shouldn't possible issues only be present when using strictly positive precisions? And it seems like it tries to handle those before delegating to the round helper. (Point being I don't totally understand why negative precisions, which will round to an integer value, seems to use the same logic as something rounding to a float val).

@bukka

Copy link
Copy Markdown
Member

I would prefer to see more complete solution to handle all cases which is either #12268 or #12291 .

@jorgsowa

Copy link
Copy Markdown
Contributor

Hi @TimWolla, will you continue this PR?

@Girgias

Copy link
Copy Markdown
Member

I don't think this PR is still relevant considering the various round() RFCs. Can this be closed @TimWolla ?

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TimWolla@SakiTakamachi@Girgias@bukka@jorgsowa
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

round: Bypass the precision logic when rounding to 0 places - #12284

Open
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero
Open

round: Bypass the precision logic when rounding to 0 places#12284
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero

Conversation

@TimWolla

Copy link
Copy Markdown
Member

Since GH-12220 the implementation of php_round_helper(), which performs rounding to an integral value, is easy to verify for correctness up to the floating point precision.

If rounding to 0 places is desired, i.e. the userland round() function is called with $precision = 0, we bypass all logic for the decimal point adjustment and instead directly call php_round_helper().

This change fixes the remaining two cases of GH-12143 and likely guarantees correct rounding for all possible inputs and $precision = 0.

/cc @SakiTakamachi

Since phpGH-12220 the implementation of `php_round_helper()`, which performs
rounding to an integral value, is easy to verify for correctness up to the
floating point precision.
If rounding to 0 places is desired, i.e. the userland `round()` function is
called with `$precision = 0`, we bypass all logic for the decimal point
adjustment and instead directly call `php_round_helper()`.
This change fixes the remaining two cases of phpGH-12143 and likely guarantees
correct rounding for all possible inputs and `$precision = 0`.
@SakiTakamachi

Copy link
Copy Markdown
Member

I haven't tried it yet, so this is just a prediction, but I think the results will be incorrect in the following cases.

round(1.700000000000145, 13, PHP_ROUND_HALF_UP);
round(1.550000000000001, 1, PHP_ROUND_HALF_DOWN)

@TimWolla

Copy link
Copy Markdown
MemberAuthor

but I think the results will be incorrect in the following cases.

These cases are not handled by this PR. It only handles the case where the second parameter is 0, i.e. integer rounding is desired. This is the case we can do exactly up to floating point precision.

@SakiTakamachi

Copy link
Copy Markdown
Member

Ah, I understand.

I cannot agree to this change.
Is there really any point in changing only the behavior when precision is 0?

Rounding to the 16th digit is not included as it is a functional modification, but all other cases can be fixed with my changes.
(There may be room for discussion on how to handle edge cases, but it would be a good idea to make some changes depending on the discussion.)

#12268

And bypassing processing when precision is 0 as a way to make the 16th digit possible is completely wrong.

@Girgias

Copy link
Copy Markdown
Member

This looks sensible? But I must say the precision adjustment code is quite confusing (probably due to the extremely generic variable names...).

But overhaul, shouldn't possible issues only be present when using strictly positive precisions? And it seems like it tries to handle those before delegating to the round helper. (Point being I don't totally understand why negative precisions, which will round to an integer value, seems to use the same logic as something rounding to a float val).

@bukka

Copy link
Copy Markdown
Member

I would prefer to see more complete solution to handle all cases which is either #12268 or #12291 .

@jorgsowa

Copy link
Copy Markdown
Contributor

Hi @TimWolla, will you continue this PR?

@Girgias

Copy link
Copy Markdown
Member

I don't think this PR is still relevant considering the various round() RFCs. Can this be closed @TimWolla ?

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TimWolla@SakiTakamachi@Girgias@bukka@jorgsowa
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

round: Bypass the precision logic when rounding to 0 places - #12284

Open
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero
Open

round: Bypass the precision logic when rounding to 0 places#12284
TimWolla wants to merge 1 commit into
php:masterfrom
TimWolla:round-precision-zero

Conversation

@TimWolla

Copy link
Copy Markdown
Member

Since GH-12220 the implementation of php_round_helper(), which performs rounding to an integral value, is easy to verify for correctness up to the floating point precision.

If rounding to 0 places is desired, i.e. the userland round() function is called with $precision = 0, we bypass all logic for the decimal point adjustment and instead directly call php_round_helper().

This change fixes the remaining two cases of GH-12143 and likely guarantees correct rounding for all possible inputs and $precision = 0.

/cc @SakiTakamachi

Since phpGH-12220 the implementation of `php_round_helper()`, which performs
rounding to an integral value, is easy to verify for correctness up to the
floating point precision.
If rounding to 0 places is desired, i.e. the userland `round()` function is
called with `$precision = 0`, we bypass all logic for the decimal point
adjustment and instead directly call `php_round_helper()`.
This change fixes the remaining two cases of phpGH-12143 and likely guarantees
correct rounding for all possible inputs and `$precision = 0`.
@SakiTakamachi

Copy link
Copy Markdown
Member

I haven't tried it yet, so this is just a prediction, but I think the results will be incorrect in the following cases.

round(1.700000000000145, 13, PHP_ROUND_HALF_UP);
round(1.550000000000001, 1, PHP_ROUND_HALF_DOWN)

@TimWolla

Copy link
Copy Markdown
MemberAuthor

but I think the results will be incorrect in the following cases.

These cases are not handled by this PR. It only handles the case where the second parameter is 0, i.e. integer rounding is desired. This is the case we can do exactly up to floating point precision.

@SakiTakamachi

Copy link
Copy Markdown
Member

Ah, I understand.

I cannot agree to this change.
Is there really any point in changing only the behavior when precision is 0?

Rounding to the 16th digit is not included as it is a functional modification, but all other cases can be fixed with my changes.
(There may be room for discussion on how to handle edge cases, but it would be a good idea to make some changes depending on the discussion.)

#12268

And bypassing processing when precision is 0 as a way to make the 16th digit possible is completely wrong.

@Girgias

Copy link
Copy Markdown
Member

This looks sensible? But I must say the precision adjustment code is quite confusing (probably due to the extremely generic variable names...).

But overhaul, shouldn't possible issues only be present when using strictly positive precisions? And it seems like it tries to handle those before delegating to the round helper. (Point being I don't totally understand why negative precisions, which will round to an integer value, seems to use the same logic as something rounding to a float val).

@bukka

Copy link
Copy Markdown
Member

I would prefer to see more complete solution to handle all cases which is either #12268 or #12291 .

@jorgsowa

Copy link
Copy Markdown
Contributor

Hi @TimWolla, will you continue this PR?

@Girgias

Copy link
Copy Markdown
Member

I don't think this PR is still relevant considering the various round() RFCs. Can this be closed @TimWolla ?

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TimWolla@SakiTakamachi@Girgias@bukka@jorgsowa