<!DOCTYPE html>

<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="mobile-web-app-capable" content="yes">
    <title>
        Floating-point overflow and underflow in from_chars (LWG 3081) - HackMD
    </title>
    <link rel="icon" type="image/png" href="https://hackmd.io/favicon.png">
    <link rel="apple-touch-icon" href="https://hackmd.io/apple-touch-icon.png">

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/3.5.0/octicons.min.css" integrity="sha256-QiWfLIsCT02Sdwkogf6YMiQlj4NE84MKkzEMkZnMGdg=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/themes/prism.min.css" integrity="sha256-vtR0hSWRc3Tb26iuN2oZHt3KRUomwTufNIf5/4oeCyg=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
    <style>
        @import url(https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,500,500i|Source+Code+Pro:300,400,500|Source+Sans+Pro:300,300i,400,400i,600,600i|Source+Serif+Pro&subset=latin-ext);.hljs{background:#fff;color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment,.hljs-meta{color:#969896}.hljs-emphasis,.hljs-quote,.hljs-string,.hljs-strong,.hljs-template-variable,.hljs-variable{color:#df5000}.hljs-keyword,.hljs-selector-tag,.hljs-type{color:#a71d5d}.hljs-attribute,.hljs-bullet,.hljs-literal,.hljs-number,.hljs-symbol{color:#0086b3}.hljs-built_in,.hljs-builtin-name{color:#005cc5}.hljs-name,.hljs-section{color:#63a35c}.hljs-tag{color:#333}.hljs-attr,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-title{color:#795da3}.hljs-addition{background-color:#eaffea;color:#55a532}.hljs-deletion{background-color:#ffecec;color:#bd2c00}.hljs-link{text-decoration:underline}.markdown-body{word-wrap:break-word;font-size:16px;line-height:1.5}.markdown-body:after,.markdown-body:before{content:"";display:table}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#c00}.markdown-body .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-bottom:16px;margin-top:0}.markdown-body hr{background-color:#e7e7e7;border:0;height:.25em;margin:24px 0;padding:0}.markdown-body blockquote{border-left:.25em solid #ddd;color:#777;font-size:16px;padding:0 1em}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd,.popover kbd{background-color:#fcfcfc;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;color:#555;display:inline-block;font-size:11px;line-height:10px;padding:3px 5px;vertical-align:middle}.markdown-body .loweralpha{list-style-type:lower-alpha}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:600;line-height:1.25;margin-bottom:16px;margin-top:24px}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{border-bottom:1px solid #eee;padding-bottom:.3em}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{color:#777;font-size:.85em}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol.no-list,.markdown-body ul.no-list{list-style-type:none;padding:0}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-bottom:0;margin-top:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{padding-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:700;margin-top:16px;padding:0}.markdown-body dl dd{margin-bottom:16px;padding:0 16px}.markdown-body table{display:block;overflow:auto;width:100%;word-break:normal;word-break:keep-all}.markdown-body table th{font-weight:700}.markdown-body table td,.markdown-body table th{border:1px solid #ddd;padding:6px 13px}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.markdown-body img{background-color:#fff;box-sizing:initial;max-width:100%}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{background-color:initial;max-width:none;vertical-align:text-top}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{border:1px solid #ddd;display:block;float:left;margin:13px 0 0;overflow:hidden;padding:7px;width:auto}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{clear:both;color:#333;display:block;padding:5px 0 0}.markdown-body span.align-center{clear:both;display:block;overflow:hidden}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{clear:both;display:block;overflow:hidden}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{background-color:#0000000a;border-radius:3px;font-size:85%;margin:0;padding:.2em 0}.markdown-body code:after,.markdown-body code:before,.markdown-body tt:after,.markdown-body tt:before{content:"\00a0";letter-spacing:-.2em}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{background:#0000;border:0;font-size:100%;margin:0;padding:0;white-space:pre;word-break:normal}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{background-color:#f7f7f7;border-radius:3px;font-size:85%;line-height:1.45;overflow:auto;padding:16px}.markdown-body pre code,.markdown-body pre tt{word-wrap:normal;background-color:initial;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0}.markdown-body pre code:after,.markdown-body pre code:before,.markdown-body pre tt:after,.markdown-body pre tt:before{content:normal}.markdown-body .csv-data td,.markdown-body .csv-data th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-line-num{background:#fff;border:0;padding:10px 8px 9px;text-align:right}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{background:#f8f8f8;border-top:0;font-weight:700}.news .alert .markdown-body blockquote{border:0;padding:0 0 0 40px}.activity-tab .news .alert .commits,.activity-tab .news .markdown-body blockquote{padding-left:0}.task-list-item{list-style-type:none}.task-list-item label{font-weight:400}.task-list-item.enabled label{cursor:pointer}.task-list-item+.task-list-item{margin-top:3px}.task-list-item-checkbox{cursor:default!important;float:left;margin:.31em 0 .2em -1.3em!important;vertical-align:middle}.markdown-body{max-width:758px;overflow:visible!important;padding-bottom:40px;padding-top:40px;position:relative}.markdown-body .emoji{vertical-align:top}.markdown-body pre{border:inherit!important}.markdown-body code{color:inherit!important}.markdown-body pre code .wrapper{display:-moz-inline-flex;display:-ms-inline-flex;display:-o-inline-flex;display:inline-flex}.markdown-body pre code .gutter{float:left;overflow:hidden;-webkit-user-select:none;user-select:none}.markdown-body pre code .gutter.linenumber{border-right:3px solid #6ce26c!important;box-sizing:initial;color:#afafaf!important;cursor:default;display:inline-block;min-width:20px;padding:0 8px 0 0;position:relative;text-align:right;z-index:4}.markdown-body pre code .gutter.linenumber>span:before{content:attr(data-linenumber)}.markdown-body pre code .code{float:left;margin:0 0 0 16px}.markdown-body .gist .line-numbers{border-bottom:none;border-left:none;border-top:none}.markdown-body .gist .line-data{border:none}.markdown-body .gist table{border-collapse:inherit!important;border-spacing:0}.markdown-body code[data-gist-id]{background:none;padding:0}.markdown-body code[data-gist-id]:after,.markdown-body code[data-gist-id]:before{content:""}.markdown-body code[data-gist-id] .blob-num{border:unset}.markdown-body code[data-gist-id] table{margin-bottom:unset;overflow:unset}.markdown-body code[data-gist-id] table tr{background:unset}.markdown-body[dir=rtl] pre{direction:ltr}.markdown-body[dir=rtl] code{direction:ltr;unicode-bidi:embed}.markdown-body .alert>p:last-child{margin-bottom:0}.markdown-body pre.abc,.markdown-body pre.flow-chart,.markdown-body pre.graphviz,.markdown-body pre.mermaid,.markdown-body pre.sequence-diagram,.markdown-body pre.vega{background-color:inherit;border-radius:0;overflow:visible;text-align:center;white-space:inherit}.markdown-body pre.abc>code,.markdown-body pre.flow-chart>code,.markdown-body pre.graphviz>code,.markdown-body pre.mermaid>code,.markdown-body pre.sequence-diagram>code,.markdown-body pre.vega>code{text-align:left}.markdown-body pre.abc>svg,.markdown-body pre.flow-chart>svg,.markdown-body pre.graphviz>svg,.markdown-body pre.mermaid>svg,.markdown-body pre.sequence-diagram>svg,.markdown-body pre.vega>svg{height:100%;max-width:100%}.markdown-body pre>code.wrap{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}.markdown-body .alert>p:last-child,.markdown-body .alert>ul:last-child{margin-bottom:0}.markdown-body summary{display:list-item}.markdown-body summary:focus{outline:none}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>:not(summary){display:none}.markdown-body figure{margin:1em 40px}.markdown-body .mark,.markdown-body mark{background-color:#fff1a7}.vimeo,.youtube{background-color:#000;background-position:50%;background-repeat:no-repeat;background-size:contain;cursor:pointer;display:table;overflow:hidden;text-align:center}.vimeo,.youtube{position:relative;width:100%}.youtube{padding-bottom:56.25%}.vimeo img{object-fit:contain;width:100%;z-index:0}.youtube img{object-fit:cover;z-index:0}.vimeo iframe,.youtube iframe,.youtube img{height:100%;left:0;position:absolute;top:0;width:100%}.vimeo iframe,.youtube iframe{vertical-align:middle;z-index:1}.vimeo .icon,.youtube .icon{color:#fff;height:auto;left:50%;opacity:.3;position:absolute;top:50%;transform:translate(-50%,-50%);transition:opacity .2s;width:auto;z-index:0}.vimeo:hover .icon,.youtube:hover .icon{opacity:.6;transition:opacity .2s}.slideshare .inner,.speakerdeck .inner{position:relative;width:100%}.slideshare .inner iframe,.speakerdeck .inner iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.figma{display:table;padding-bottom:56.25%;position:relative;width:100%}.figma iframe{border:1px solid #eee;bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.markmap-container{height:300px}.markmap-container>svg{height:100%;width:100%}.MJX_Assistive_MathML{display:none}#MathJax_Message{z-index:1000!important}.ui-infobar{color:#777;margin:25px auto -25px;max-width:760px;position:relative;z-index:2}.toc .invisable-node{list-style-type:none}.ui-toc{bottom:20px;position:fixed;z-index:998}.ui-toc.both-mode{margin-left:8px}.ui-toc.both-mode .ui-toc-label{border-bottom-left-radius:0;border-top-left-radius:0;height:40px;padding:10px 4px}.ui-toc-label{background-color:#e6e6e6;border:none;color:#868686;transition:opacity .2s}.ui-toc .open .ui-toc-label{color:#fff;opacity:1;transition:opacity .2s}.ui-toc-label:focus{background-color:#ccc;color:#000;opacity:.3}.ui-toc-label:hover{background-color:#ccc;opacity:1;transition:opacity .2s}.ui-toc-dropdown{margin-bottom:20px;margin-top:20px;max-height:70vh;max-width:45vw;overflow:auto;padding-left:10px;padding-right:10px;text-align:inherit;width:25vw}.ui-toc-dropdown>.toc{max-height:calc(70vh - 100px);overflow:auto}.ui-toc-dropdown[dir=rtl] .nav{letter-spacing:.0029em;padding-right:0}.ui-toc-dropdown a{overflow:hidden;text-overflow:ellipsis;white-space:pre}.ui-toc-dropdown .nav>li>a{color:#767676;display:block;font-size:13px;font-weight:500;padding:4px 20px}.ui-toc-dropdown .nav>li:first-child:last-child>ul,.ui-toc-dropdown .toc.expand ul{display:block}.ui-toc-dropdown .nav>li>a:focus,.ui-toc-dropdown .nav>li>a:hover{background-color:initial;border-left:1px solid #000;color:#000;padding-left:19px;text-decoration:none}.ui-toc-dropdown[dir=rtl] .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav>li>a:hover{border-left:none;border-right:1px solid #000;padding-right:19px}.ui-toc-dropdown .nav>.active:focus>a,.ui-toc-dropdown .nav>.active:hover>a,.ui-toc-dropdown .nav>.active>a{background-color:initial;border-left:2px solid #000;color:#000;font-weight:700;padding-left:18px}.ui-toc-dropdown[dir=rtl] .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav>.active>a{border-left:none;border-right:2px solid #000;padding-right:18px}.ui-toc-dropdown .nav .nav{display:none;padding-bottom:10px}.ui-toc-dropdown .nav>.active>ul{display:block}.ui-toc-dropdown .nav .nav>li>a{font-size:12px;font-weight:400;padding-bottom:1px;padding-left:30px;padding-top:1px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a{padding-right:30px}.ui-toc-dropdown .nav .nav>li>ul>li>a{font-size:12px;font-weight:400;padding-bottom:1px;padding-left:40px;padding-top:1px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a{padding-right:40px}.ui-toc-dropdown .nav .nav>li>a:focus,.ui-toc-dropdown .nav .nav>li>a:hover{padding-left:29px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:hover{padding-right:29px}.ui-toc-dropdown .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown .nav .nav>li>ul>li>a:hover{padding-left:39px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:hover{padding-right:39px}.ui-toc-dropdown .nav .nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>a{font-weight:500;padding-left:28px}.ui-toc-dropdown[dir=rtl] .nav .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>a{padding-right:28px}.ui-toc-dropdown .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active>a{font-weight:500;padding-left:38px}.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active>a{padding-right:38px}.markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html[lang^=ja] .markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,ＭＳ ゴシック,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html[lang=zh-tw] .markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html[lang=zh-cn] .markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html .markdown-body[lang^=ja]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,ＭＳ ゴシック,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html .markdown-body[lang=zh-tw]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html .markdown-body[lang=zh-cn]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}html[lang^=ja] .ui-toc-dropdown{font-family:Source Sans Pro,Helvetica,Arial,Meiryo UI,MS PGothic,ＭＳ Ｐゴシック,sans-serif}html[lang=zh-tw] .ui-toc-dropdown{font-family:Source Sans Pro,Helvetica,Arial,Microsoft JhengHei UI,微軟正黑UI,sans-serif}html[lang=zh-cn] .ui-toc-dropdown{font-family:Source Sans Pro,Helvetica,Arial,Microsoft YaHei UI,微软雅黑UI,sans-serif}html .ui-toc-dropdown[lang^=ja]{font-family:Source Sans Pro,Helvetica,Arial,Meiryo UI,MS PGothic,ＭＳ Ｐゴシック,sans-serif}html .ui-toc-dropdown[lang=zh-tw]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft JhengHei UI,微軟正黑UI,sans-serif}html .ui-toc-dropdown[lang=zh-cn]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft YaHei UI,微软雅黑UI,sans-serif}.ui-affix-toc{max-height:70vh;max-width:15vw;overflow:auto;position:fixed;top:0}.back-to-top,.expand-toggle,.go-to-bottom{color:#999;display:block;font-size:12px;font-weight:500;margin-left:10px;margin-top:10px;padding:4px 10px}.back-to-top:focus,.back-to-top:hover,.expand-toggle:focus,.expand-toggle:hover,.go-to-bottom:focus,.go-to-bottom:hover{color:#563d7c;text-decoration:none}.back-to-top,.go-to-bottom{margin-top:0}.ui-user-icon{background-position:50%;background-repeat:no-repeat;background-size:cover;border-radius:50%;display:block;height:20px;margin-bottom:2px;margin-right:5px;margin-top:2px;width:20px}.ui-user-icon.small{display:inline-block;height:18px;margin:0 0 .2em;vertical-align:middle;width:18px}.ui-infobar>small>span{line-height:22px}.ui-infobar>small .dropdown{display:inline-block}.ui-infobar>small .dropdown a:focus,.ui-infobar>small .dropdown a:hover{text-decoration:none}.ui-more-info{color:#888;cursor:pointer;vertical-align:middle}.ui-more-info .fa{font-size:16px}.ui-connectedGithub,.ui-published-note{color:#888}.ui-connectedGithub{line-height:23px;white-space:nowrap}.ui-connectedGithub a.file-path{color:#888;padding-left:22px;text-decoration:none}.ui-connectedGithub a.file-path:active,.ui-connectedGithub a.file-path:hover{color:#888;text-decoration:underline}.ui-connectedGithub .fa{font-size:20px}.ui-published-note .fa{font-size:20px;vertical-align:top}.unselectable{-webkit-user-select:none;-o-user-select:none;user-select:none}.selectable{-webkit-user-select:text;-o-user-select:text;user-select:text}.inline-spoiler-section{cursor:pointer}.inline-spoiler-section .spoiler-text{background-color:#333;border-radius:2px}.inline-spoiler-section .spoiler-text>*{opacity:0}.inline-spoiler-section .spoiler-img{filter:blur(10px)}.inline-spoiler-section.raw{background-color:#333;border-radius:2px}.inline-spoiler-section.raw>*{opacity:0}.inline-spoiler-section.unveil{cursor:auto}.inline-spoiler-section.unveil .spoiler-text{background-color:#3333331a}.inline-spoiler-section.unveil .spoiler-text>*{opacity:1}.inline-spoiler-section.unveil .spoiler-img{filter:none}@media print{blockquote,div,img,pre,table{page-break-inside:avoid!important}a[href]:after{font-size:12px!important}}.markdown-body.slides{color:#222;position:relative;z-index:1}.markdown-body.slides:before{background-color:currentColor;bottom:0;box-shadow:0 0 0 50vw;content:"";display:block;left:0;position:absolute;right:0;top:0;z-index:-1}.markdown-body.slides section[data-markdown]{background-color:#fff;margin-bottom:1.5em;position:relative;text-align:center}.markdown-body.slides section[data-markdown] code{text-align:left}.markdown-body.slides section[data-markdown]:before{content:"";display:block;padding-bottom:56.23%}.markdown-body.slides section[data-markdown]>div:first-child{left:1em;max-height:100%;overflow:hidden;position:absolute;right:1em;top:50%;transform:translateY(-50%)}.markdown-body.slides section[data-markdown]>ul{display:inline-block}.markdown-body.slides>section>section+section:after{border:3px solid #777;content:"";height:1.5em;position:absolute;right:1em;top:-1.5em}.site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,sans-serif}html[lang^=ja] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,ＭＳ ゴシック,sans-serif}html[lang=zh-tw] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif}html[lang=zh-cn] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif}body{font-smoothing:subpixel-antialiased!important;-webkit-font-smoothing:subpixel-antialiased!important;-moz-osx-font-smoothing:auto!important;-webkit-overflow-scrolling:touch;font-family:Source Sans Pro,Helvetica,Arial,sans-serif;letter-spacing:.025em}html[lang^=ja] body{font-family:Source Sans Pro,Helvetica,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,ＭＳ ゴシック,sans-serif}html[lang=zh-tw] body{font-family:Source Sans Pro,Helvetica,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif}html[lang=zh-cn] body{font-family:Source Sans Pro,Helvetica,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}abbr[data-original-title],abbr[title]{cursor:help}body.modal-open{overflow-y:auto;padding-right:0!important}svg{text-shadow:none}
    </style>
    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js" integrity="sha256-3Jy/GbSLrg0o9y5Z5n1uw0qxZECH7C6OQpVBgNFYa0g=" crossorigin="anonymous"></script>
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js" integrity="sha256-g6iAfvZp+nDQ2TdTR/VVKJf3bGro4ub5fvWSWVRi2NE=" crossorigin="anonymous"></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.9/es5-shim.min.js" integrity="sha256-8E4Is26QH0bD52WoQpcB+R/tcWQtpzlCojrybUd7Mxo=" crossorigin="anonymous"></script>
    <![endif]-->
</head>

<body>
    <div id="doc" class="markdown-body container-fluid comment-enabled" data-hard-breaks="true"><style>
ins { background-color: #CCFFCC }
s { background-color: #FFCACA }
blockquote { color: inherit !important }
table.no-alt tr:nth-child(2n) { background-color: inherit }
.godbolt {
    background-size: contain;
    background-repeat: no-repeat;
    background-position-y: center;
    background-image: url("data:image/x-icon;base64,AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAMAAAAEAAAABAAAAAUAAAAGAAAABgAAAAUAAAAEAAAABAAAAAMAAAACAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAUAAAAGAAAACAAAAAkAAAALAAAADAAAAAwAAAALAAAACgAAAAgAAAAGAAAABAAAAAMAAAACAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAwAAAAUAAAAIAAAADAAAAA8AAAASAAAAFQAAABYAAAAWAAAAFAAAABMAAAAPAAAADAAAAAgAAAAFAAAAAwAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAwAAAAMAAAACwAAAAoAAAAIAAAABgAAAAUAAAADAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAgAAAAIAAAADAAAABAAAAAUAAAAGAAAABgAAAAUAAAAFAAAABAAAAAMAAAACAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAADAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////+B/////////wD/////////AH////////4Af////////gA////////8AB/v////4eAAB4f////AAAAAA////4AAAAAB////AAAAAAD///4AAAAAAH///gAB/8AAf///AAf/8AD///8AH//4AP///4A///4B////gH///wH///+A////Af///wH///+A////A8AAA/////4DwAAD/////gfAAAP////4B+AAA////8AH////////wAf////////AB+AAP////8AHwAAf////wAfAAB/////AB8AAH////8AH////////wAf////////wB+AAA/////4HwAAD/////gPAAAP/////A8AAA/////8B////gP///4D///+A////gH///wH///+AP//+Af///4Af//wA////AA//8AD///4AA//AAH///gAAAAAAf///AAAAAAD///+AAAAAAf///8AAAAAD////4eAAB4f////3+AAf7//////+AH////////4Af////////gB/////////AP////////+A////////////////////////////////////////////////////////////////////8=")
}
</style><table><tbody>
<tr><th>Doc. no.:</th>    <td>P2827R0</td></tr>
<tr><th>Date:</th>        <td>2022-3-14</td></tr>
<tr><th>Audience:</th>    <td>LEWG, LWG</td></tr>
<tr><th>Reply-to:</th>    <td>Zhihao Yuan &lt;zy@miator.net&gt;</td></tr>
</tbody></table><h1 id="Floating-point-overflow-and-underflow-in-from_chars-LWG-3081" data-id="Floating-point-overflow-and-underflow-in-from_chars-LWG-3081"><a class="anchor hidden-xs" href="#Floating-point-overflow-and-underflow-in-from_chars-LWG-3081" title="Floating-point-overflow-and-underflow-in-from_chars-LWG-3081"><span class="octicon octicon-link"></span></a><span>Floating-point overflow and underflow in </span><code>from_chars</code><span> (LWG 3081)</span></h1><p><span class="toc"><ul>
<li><a href="#Floating-point-overflow-and-underflow-in-from_chars-LWG-3081" title="Floating-point overflow and underflow in from_chars (LWG 3081)">Floating-point overflow and underflow in from_chars (LWG 3081)</a><ul>
<li><a href="#Motivation" title="Motivation">Motivation</a></li>
<li><a href="#Background" title="Background">Background</a></li>
<li><a href="#Technical-Decisions" title="Technical Decisions">Technical Decisions</a></li>
<li><a href="#Implementation" title="Implementation">Implementation</a></li>
<li><a href="#Wording" title="Wording">Wording</a><ul>
<li><a href="#Feature-test-macro" title="Feature test macro">Feature test macro</a></li>
</ul>
</li>
<li><a href="#References" title="References">References</a></li>
</ul>
</li>
</ul>
</span></p><h2 id="Motivation" data-id="Motivation"><a class="anchor hidden-xs" href="#Motivation" title="Motivation"><span class="octicon octicon-link"></span></a><span>Motivation</span></h2><p><span>When parsing floating-point numbers, I want to distinguish a failure between “unable to store in </span><code>double</code><span> because the ideal value is too large” and “unable to store in </span><code>double</code><span> because the ideal value is too small.” </span><code>std::from_chars</code><span>, as currently specified, cannot give this information. </span><code>from_chars</code><span> writes to an output parameter </span><code>value</code><span> and returns </span><code>from_chars_result</code><span>.</span></p><pre><code class="cpp hljs"><span class="token keyword">struct</span> <span class="token class-name">from_chars_result</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> <span class="token keyword">char</span><span class="token operator">*</span> ptr<span class="token punctuation">;</span>
    errc ec<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
</code></pre><p><span>To quote from </span><a href="https://eel.is/c++draft/charconv#from.chars" target="_blank" rel="noopener"><span>[charconv.from.chars]</span></a><span>:</span></p><blockquote>
<p><span>If the parsed value is not in the range representable by the type of </span><code>value</code><span>, </span><code>value</code><span> is unmodified and the member </span><code>ec</code><span> of the return value is equal to </span><code>errc::result_out_of_range</code><span>.</span></p>
</blockquote><p><span>In short, one cannot even implement the Python interpreter’s behavior using </span><code>from_chars</code><span>.</span></p><pre><code class="python hljs"><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-number">3.14e-2000</span>
<span class="hljs-number">0.0</span>
<span class="hljs-meta">&gt;&gt;&gt; </span>-<span class="hljs-number">1.1e360</span>
-inf
</code></pre><p><span>The status quo also creates false expectations for learners. Because when parsing integers, </span><code>errc::result_out_of_range</code><span> implies overflow. Then, when parsing floating-point numbers, few people realize that their code can report “number is too big” when the number is too small.</span></p><h2 id="Background" data-id="Background"><a class="anchor hidden-xs" href="#Background" title="Background"><span class="octicon octicon-link"></span></a><span>Background</span></h2><p><a href="https://cplusplus.github.io/LWG/issue3081" target="_blank" rel="noopener"><span>LWG 3081</span></a><span> points out that users may encounter a loss of functionality when migrating from </span><code>strtod</code><span> to </span><code>from_chars</code><span>. This is largely true. In the case of </span><code>double</code><span>, the C standard requires </span><code>strtod</code><span> to return plus or minus </span><code>HUGE_VAL</code><span> and </span><code>errno</code><span> to acquire the value of </span><code>ERANGE</code><span> if the ideal value is too large, and to return “a value whose magnitude is no greater than the smallest normalized positive number” if the ideal value is too small, while whether </span><code>ERANGE</code><span> is set is implementation-defined. But in reality, it is becoming a defacto-standard for a decent </span><code>strtod</code><span> implementation to return a </span><code>0.</code><span> or </span><code>-0.</code><span> and set </span><code>errno</code><span> to </span><code>ERANGE</code><span>. Here is a snippet that runs on FreeBSD: </span><ruby><a href="https://godbolt.miator.net/z/EaW53G" target="_blank" rel="noopener"><span class="godbolt"><span> </span></span><span>EaW53G</span></a><rt><span>(self-host)</span></rt></ruby><span>.</span></p><p><span>The C standard enables the following code to detect whether the number to parse is too large portably:</span></p><pre><code class="cpp hljs">errno <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
n <span class="token operator">=</span> <span class="token function">strtod</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>errno <span class="token operator">==</span> ERANGE <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>n <span class="token operator">==</span> HUGE_VAL <span class="token operator">||</span> n <span class="token operator">==</span> <span class="token operator">-</span>HUGE_VAL<span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token comment">/* number is too big */</span>
</code></pre><p><span>However, I once saw a student come up with the following code:</span></p><pre><code class="cpp hljs">errno <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
n <span class="token operator">=</span> <span class="token function">strtod</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>errno <span class="token operator">==</span> ERANGE <span class="token operator">&amp;&amp;</span> n <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span>
    <span class="token comment">/* number is too big */</span>
</code></pre><p><span>It’s interesting and sufficiently portable. It took advantage of the fact that both </span><code>0.</code><span> and </span><code>-0.</code><span> compared equal to </span><code>0</code><span> and reduced the criteria to a single test. Note that, pedantically speaking, you cannot test both positive and negative </span><code>HUGE_VAL</code><span> with </span><code>isinf</code><span> because there is no guarantee that </span><code>HUGE_VAL</code><span> is not finite. To summarize, if we want to designate special values to distinguish underflow from overflow, </span><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-1-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-1" class="mjx-math"><span id="MJXc-Node-2" class="mjx-mrow"><span id="MJXc-Node-3" class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">±</span></span></span></span></span><script type="math/tex" id="MathJax-Element-1">\pm</script></span><code>0.</code><span> provides an advantage indeed.</span></p><h2 id="Technical-Decisions" data-id="Technical-Decisions"><a class="anchor hidden-xs" href="#Technical-Decisions" title="Technical-Decisions"><span class="octicon octicon-link"></span></a><span>Technical Decisions</span></h2><p><span>Solving the problem requires finding a way to channel more error information back to the users of </span><code>from_chars</code><span>. So, we have design alternatives.</span></p><dl>
<dt><span>A. Throw an exception</span></dt>
<dd><span>Not in </span><code>&lt;charconv&gt;</code><span>.</span><sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup></dd>
<dt><span>B. Set a global variable</span></dt>
<dd><span>No.</span></dd>
<dt><span>C. Return some value other than </span><code>errc::result_out_of_range</code></dt>
<dd><span>This breaks backward compatibility. It is reasonable for existing code to look specifically for </span><code>errc::invalid_argument</code><span> and </span><code>errc::result_out_of_range</code><span>; introducing a new error condition can change the meaning of such code.</span></dd>
<dt><span>D. Assign </span><code>value</code><span> to special values</span></dt>
<dd><span>Seems to be the only feasible thing to do.</span></dd>
</dl><p><span>“What special values” is the question. Here is a table to sort out the choices:</span></p><table>
<thead>
<tr>
<th><span>Idea</span></th>
<th><span>Underflow</span></th>
<th><span>Overflow</span></th>
</tr>
</thead>
<tbody>
<tr>
<td><span>Python</span></td>
<td><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-2-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-4" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-5" class="mjx-mrow"><span id="MJXc-Node-6" class="mjx-mo" data-semantic-type="operator" data-semantic-role="addition" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">±</span></span></span></span></span><script type="math/tex" id="MathJax-Element-2">\pm</script></span><code>0.</code></td>
<td><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-3-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-7" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-8" class="mjx-mrow"><span id="MJXc-Node-9" class="mjx-mo" data-semantic-type="operator" data-semantic-role="addition" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">±</span></span></span></span></span><script type="math/tex" id="MathJax-Element-3">\pm</script></span><code>inf</code></td>
</tr>
<tr>
<td><span>Popular </span><code>strtod</code><span> impl.</span></td>
<td><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-4-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-10" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-11" class="mjx-mrow"><span id="MJXc-Node-12" class="mjx-mo" data-semantic-type="operator" data-semantic-role="addition" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">±</span></span></span></span></span><script type="math/tex" id="MathJax-Element-4">\pm</script></span><code>0.</code></td>
<td><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-5-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-13" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-14" class="mjx-mrow"><span id="MJXc-Node-15" class="mjx-mo" data-semantic-type="operator" data-semantic-role="addition" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">±</span></span></span></span></span><script type="math/tex" id="MathJax-Element-5">\pm</script></span><code>HUGE_VAL</code></td>
</tr>
<tr>
<td><code>strtod</code></td>
<td><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-6-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-16" class="mjx-math" data-semantic-type="punctuated" data-semantic-role="endpunct" data-semantic-id="2" data-semantic-children="0,1" data-semantic-content="1" data-semantic-complexity="4"><span id="MJXc-Node-17" class="mjx-mrow"><span id="MJXc-Node-18" class="mjx-mo" data-semantic-type="operator" data-semantic-role="addition" data-semantic-id="0" data-semantic-parent="2" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">±</span></span><span id="MJXc-Node-19" class="mjx-mo" data-semantic-type="punctuation" data-semantic-role="openfence" data-semantic-id="1" data-semantic-parent="2" data-semantic-operator="punctuated" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">[</span></span></span></span></span><script type="math/tex" id="MathJax-Element-6">\pm[</script></span><code>0</code><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-7-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-20" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-21" class="mjx-mrow"><span id="MJXc-Node-22" class="mjx-mo" data-semantic-type="punctuation" data-semantic-role="comma" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="margin-top: -0.163em; padding-bottom: 0.556em;">,</span></span></span></span></span><script type="math/tex" id="MathJax-Element-7">,</script></span><code>finite_min_v&lt;T&gt;</code><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-8-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-23" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-24" class="mjx-mrow"><span id="MJXc-Node-25" class="mjx-mo" data-semantic-type="fence" data-semantic-role="close" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">]</span></span></span></span></span><script type="math/tex" id="MathJax-Element-8">]</script></span></td>
<td><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-9-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-26" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-27" class="mjx-mrow"><span id="MJXc-Node-28" class="mjx-mo" data-semantic-type="operator" data-semantic-role="addition" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">±</span></span></span></span></span><script type="math/tex" id="MathJax-Element-9">\pm</script></span><code>HUGE_VAL</code></td>
</tr>
<tr>
<td><span>LWG 3081</span><sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup></td>
<td><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-10-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-29" class="mjx-math" data-semantic-type="punctuated" data-semantic-role="endpunct" data-semantic-id="2" data-semantic-children="0,1" data-semantic-content="1" data-semantic-complexity="4"><span id="MJXc-Node-30" class="mjx-mrow"><span id="MJXc-Node-31" class="mjx-mo" data-semantic-type="operator" data-semantic-role="addition" data-semantic-id="0" data-semantic-parent="2" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">±</span></span><span id="MJXc-Node-32" class="mjx-mo" data-semantic-type="punctuation" data-semantic-role="openfence" data-semantic-id="1" data-semantic-parent="2" data-semantic-operator="punctuated" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">[</span></span></span></span></span><script type="math/tex" id="MathJax-Element-10">\pm[</script></span><code>0</code><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-11-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-33" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-34" class="mjx-mrow"><span id="MJXc-Node-35" class="mjx-mo" data-semantic-type="punctuation" data-semantic-role="comma" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="margin-top: -0.163em; padding-bottom: 0.556em;">,</span></span></span></span></span><script type="math/tex" id="MathJax-Element-11">,</script></span><code>finite_min_v&lt;T&gt;</code><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-12-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-36" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-37" class="mjx-mrow"><span id="MJXc-Node-38" class="mjx-mo" data-semantic-type="fence" data-semantic-role="close" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">]</span></span></span></span></span><script type="math/tex" id="MathJax-Element-12">]</script></span></td>
<td><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-13-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-39" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-40" class="mjx-mrow"><span id="MJXc-Node-41" class="mjx-mo" data-semantic-type="operator" data-semantic-role="addition" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">±</span></span></span></span></span><script type="math/tex" id="MathJax-Element-13">\pm</script></span><code>finite_max_v&lt;T&gt;</code></td>
</tr>
<tr>
<td><mark><span>P2827</span></mark></td>
<td><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-14-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-42" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-43" class="mjx-mrow"><span id="MJXc-Node-44" class="mjx-mo" data-semantic-type="operator" data-semantic-role="addition" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">±</span></span></span></span></span><script type="math/tex" id="MathJax-Element-14">\pm</script></span><code>0.</code></td>
<td><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-15-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-45" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-46" class="mjx-mrow"><span id="MJXc-Node-47" class="mjx-mo" data-semantic-type="operator" data-semantic-role="addition" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">±</span></span></span></span></span><script type="math/tex" id="MathJax-Element-15">\pm</script></span><code>1.</code></td>
</tr>
</tbody>
</table><p><span>The observation is that no special value is perfect without error handling. For example, even with a subnormal number, the relative quantization error can be significant. Therefore, this paper proposes an option that is portable, specified, and boolean-testable simultaneously but obviously mandates error handling.</span></p><p><span>As a probably unimportant detail, assigning any special value can be observed in some backward-incompatible fashion. A strict reading of the standard can tell you that “</span><code>from_chars</code><span> never assign </span><code>value</code><span> to a non-finite value.” So errors could be handled like this:</span></p><pre><code class="cpp hljs"><span class="token keyword">auto</span> v <span class="token operator">=</span> quiet_NaN_v<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
std<span class="token double-colon punctuation">::</span><span class="token function">from_chars</span><span class="token punctuation">(</span>first<span class="token punctuation">,</span> last<span class="token punctuation">,</span> v<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">not</span> std<span class="token double-colon punctuation">::</span><span class="token function">isfinite</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token comment">/* ec != errc() */</span>
</code></pre><p><span>But this is rather atypical. Regardless, let’s bump a version year in the feature testing macros.</span></p><h2 id="Implementation" data-id="Implementation"><a class="anchor hidden-xs" href="#Implementation" title="Implementation"><span class="octicon octicon-link"></span></a><span>Implementation</span></h2><p><span>None at the time of writing, but as easy as this patch:</span></p><ul>
<li><a href="https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=40b0d4472a2591cf27f3a81aa3fba57dc4532648" target="_blank" rel="noopener"><span>libstdc++: Adjust fast_float’s over/underflow behavior for conformance</span></a></li>
</ul><p><span>As you can see, the underlying algorithm has full knowledge of underflow/overflow, but today a standard library implementation must mask this fact to be compliant.</span></p><h2 id="Wording" data-id="Wording"><a class="anchor hidden-xs" href="#Wording" title="Wording"><span class="octicon octicon-link"></span></a><span>Wording</span></h2><p><span>The wording is relative to </span><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4928.pdf" target="_blank" rel="noopener"><span>N4928</span></a><span>.</span></p><p><span>Modify </span><a href="https://eel.is/c++draft/charconv.from.chars" target="_blank" rel="noopener"><span>[charconv.from.chars]</span></a><span> as indicated:</span></p><blockquote>
<p><span>[…] Otherwise, the characters matching the pattern are interpreted as a representation of a value of the type of </span><code>value</code><span>. The member </span><code>ptr</code><span> of the return value points to the first character not matching the pattern, or has the value </span><code>last</code><span> if all characters match. If the parsed value is not in the range representable by the type of </span><code>value</code><span>, </span><code>value</code><span> is unmodified </span><ins><span>unless otherwise specified</span></ins><span> and the member </span><code>ec</code><span> of the return value is equal to </span><code>errc::result_out_of_range</code><span>. […]</span></p>
</blockquote><div class="alert alert-warning">
<p><em><span>[Drafting note:</span></em>
<span>The behavior is retained when parsing integers.</span>
<em><span>–end note]</span></em></p>
</div><pre>from_chars_result from_chars(const char* first, const char* last, <i>floating-point-type</i>&amp; value,
                             chars_format fmt = chars_format::general);
</pre><blockquote>
<p><em><span>Preconditions:</span></em><span> </span><code>fmt</code><span> has the value of one of the enumerators of </span><code>chars_format</code><span>.</span></p>
<p><em><span>Effects:</span></em><span> The pattern is the expected form of the subject sequence in the </span><code>"C"</code><span> locale, as described for </span><code>strtod</code><span>, except that</span></p>
<p><span>[…]</span></p>
<p><ins><span>Let the value of the string matching the pattern be </span><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-16-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-48" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-49" class="mjx-mrow"><span id="MJXc-Node-50" class="mjx-mi" data-semantic-type="identifier" data-semantic-role="latinletter" data-semantic-font="italic" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.445em; padding-bottom: 0.279em; padding-right: 0.186em;">V</span></span></span></span></span><script type="math/tex" id="MathJax-Element-16">V</script></span><span>. If </span><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-17-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-51" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-52" class="mjx-mrow"><span id="MJXc-Node-53" class="mjx-mi" data-semantic-type="identifier" data-semantic-role="latinletter" data-semantic-font="italic" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.445em; padding-bottom: 0.279em; padding-right: 0.186em;">V</span></span></span></span></span><script type="math/tex" id="MathJax-Element-17">V</script></span><span> is not in the range representable by </span><em><code>floating-point-type</code></em><span>, </span><code>value</code><span> is assigned to</span></ins></p>
<ul>
<li><ins><code> 0.</code><span> if </span><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-18-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-54" class="mjx-math"><span id="MJX-Collapse-1" class="mjx-maction" data-semantic-complexity="2" style="cursor: pointer;"><span id="MJXc-Node-56" class="mjx-mrow" data-semantic-complexity="16" data-semantic-content="1" data-semantic-children="0,8" data-semantic-id="9" data-semantic-role="unknown" data-semantic-type="infixop"><span id="MJXc-Node-57" class="mjx-mrow"><span id="MJXc-Node-58" class="mjx-mi" data-semantic-type="identifier" data-semantic-role="latinletter" data-semantic-font="italic" data-semantic-id="0" data-semantic-parent="9" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.445em; padding-bottom: 0.279em; padding-right: 0.186em;">V</span></span><span id="MJXc-Node-59" class="mjx-mo MJXc-space3" data-semantic-type="operator" data-semantic-role="unknown" data-semantic-id="1" data-semantic-parent="9" data-semantic-operator="infixop,∈" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.279em; padding-bottom: 0.39em;">∈</span></span><span id="MJXc-Node-60" class="mjx-mrow MJXc-space3" data-semantic-type="fenced" data-semantic-role="leftright" data-semantic-id="8" data-semantic-children="7" data-semantic-content="2,6" data-semantic-parent="9" data-semantic-complexity="11"><span id="MJXc-Node-61" class="mjx-mo" data-semantic-type="fence" data-semantic-role="open" data-semantic-id="2" data-semantic-parent="8" data-semantic-operator="fenced" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">(</span></span><span id="MJXc-Node-62" class="mjx-mrow" data-semantic-type="punctuated" data-semantic-role="sequence" data-semantic-id="7" data-semantic-children="3,4,5" data-semantic-content="4" data-semantic-parent="8" data-semantic-complexity="6"><span id="MJXc-Node-63" class="mjx-mn" data-semantic-type="number" data-semantic-role="integer" data-semantic-font="normal" data-semantic-id="3" data-semantic-parent="7" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.39em;">0</span></span><span id="MJXc-Node-64" class="mjx-mo" data-semantic-type="punctuation" data-semantic-role="comma" data-semantic-id="4" data-semantic-parent="7" data-semantic-operator="punctuated" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="margin-top: -0.163em; padding-bottom: 0.556em;">,</span></span><span id="MJXc-Node-65" class="mjx-mn MJXc-space1" data-semantic-type="number" data-semantic-role="integer" data-semantic-font="normal" data-semantic-id="5" data-semantic-parent="7" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">1</span></span></span><span id="MJXc-Node-66" class="mjx-mo" data-semantic-type="fence" data-semantic-role="close" data-semantic-id="6" data-semantic-parent="8" data-semantic-operator="fenced" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">)</span></span></span></span></span></span></span></span><script type="math/tex" id="MathJax-Element-18">V \in (0,1)</script></span><span>, or</span></ins></li>
<li><ins><code>-0.</code><span> if </span><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-19-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-67" class="mjx-math"><span id="MJX-Collapse-2" class="mjx-maction" data-semantic-complexity="2" style="cursor: pointer;"><span id="MJXc-Node-69" class="mjx-mrow" data-semantic-complexity="19" data-semantic-content="1" data-semantic-children="0,10" data-semantic-id="11" data-semantic-role="unknown" data-semantic-type="infixop"><span id="MJXc-Node-70" class="mjx-mrow"><span id="MJXc-Node-71" class="mjx-mi" data-semantic-type="identifier" data-semantic-role="latinletter" data-semantic-font="italic" data-semantic-id="0" data-semantic-parent="11" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.445em; padding-bottom: 0.279em; padding-right: 0.186em;">V</span></span><span id="MJXc-Node-72" class="mjx-mo MJXc-space3" data-semantic-type="operator" data-semantic-role="unknown" data-semantic-id="1" data-semantic-parent="11" data-semantic-operator="infixop,∈" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.279em; padding-bottom: 0.39em;">∈</span></span><span id="MJXc-Node-73" class="mjx-mrow MJXc-space3" data-semantic-type="fenced" data-semantic-role="leftright" data-semantic-id="10" data-semantic-children="9" data-semantic-content="2,7" data-semantic-parent="11" data-semantic-complexity="14"><span id="MJXc-Node-74" class="mjx-mo" data-semantic-type="fence" data-semantic-role="open" data-semantic-id="2" data-semantic-parent="10" data-semantic-operator="fenced" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">(</span></span><span id="MJXc-Node-75" class="mjx-mrow" data-semantic-type="punctuated" data-semantic-role="sequence" data-semantic-id="9" data-semantic-children="8,5,6" data-semantic-content="5" data-semantic-parent="10" data-semantic-complexity="9"><span id="MJXc-Node-76" class="mjx-mrow" data-semantic-type="prefixop" data-semantic-role="negative" data-semantic-id="8" data-semantic-children="4" data-semantic-content="3" data-semantic-parent="9" data-semantic-complexity="4"><span id="MJXc-Node-77" class="mjx-mo" data-semantic-type="operator" data-semantic-role="subtraction" data-semantic-id="3" data-semantic-parent="8" data-semantic-operator="prefixop,−" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.279em; padding-bottom: 0.445em;">−</span></span><span id="MJXc-Node-78" class="mjx-mn" data-semantic-type="number" data-semantic-role="integer" data-semantic-font="normal" data-semantic-id="4" data-semantic-parent="8" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">1</span></span></span><span id="MJXc-Node-79" class="mjx-mo" data-semantic-type="punctuation" data-semantic-role="comma" data-semantic-id="5" data-semantic-parent="9" data-semantic-operator="punctuated" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="margin-top: -0.163em; padding-bottom: 0.556em;">,</span></span><span id="MJXc-Node-80" class="mjx-mn MJXc-space1" data-semantic-type="number" data-semantic-role="integer" data-semantic-font="normal" data-semantic-id="6" data-semantic-parent="9" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.39em;">0</span></span></span><span id="MJXc-Node-81" class="mjx-mo" data-semantic-type="fence" data-semantic-role="close" data-semantic-id="7" data-semantic-parent="10" data-semantic-operator="fenced" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">)</span></span></span></span></span></span></span></span><script type="math/tex" id="MathJax-Element-19">V \in (-1,0)</script></span><span>, or</span></ins></li>
<li><ins><code> 1.</code><span> if </span><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-20-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-82" class="mjx-math"><span id="MJX-Collapse-3" class="mjx-maction" data-semantic-complexity="2" style="cursor: pointer;"><span id="MJXc-Node-84" class="mjx-mrow" data-semantic-complexity="16" data-semantic-content="1" data-semantic-children="0,8" data-semantic-id="9" data-semantic-role="unknown" data-semantic-type="infixop"><span id="MJXc-Node-85" class="mjx-mrow"><span id="MJXc-Node-86" class="mjx-mi" data-semantic-type="identifier" data-semantic-role="latinletter" data-semantic-font="italic" data-semantic-id="0" data-semantic-parent="9" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.445em; padding-bottom: 0.279em; padding-right: 0.186em;">V</span></span><span id="MJXc-Node-87" class="mjx-mo MJXc-space3" data-semantic-type="operator" data-semantic-role="unknown" data-semantic-id="1" data-semantic-parent="9" data-semantic-operator="infixop,∈" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.279em; padding-bottom: 0.39em;">∈</span></span><span id="MJXc-Node-88" class="mjx-mrow MJXc-space3" data-semantic-type="fenced" data-semantic-role="leftright" data-semantic-id="8" data-semantic-children="7" data-semantic-content="2,6" data-semantic-parent="9" data-semantic-complexity="11"><span id="MJXc-Node-89" class="mjx-mo" data-semantic-type="fence" data-semantic-role="open" data-semantic-id="2" data-semantic-parent="8" data-semantic-operator="fenced" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">(</span></span><span id="MJXc-Node-90" class="mjx-mrow" data-semantic-type="punctuated" data-semantic-role="sequence" data-semantic-id="7" data-semantic-children="3,4,5" data-semantic-content="4" data-semantic-parent="8" data-semantic-complexity="6"><span id="MJXc-Node-91" class="mjx-mn" data-semantic-type="number" data-semantic-role="integer" data-semantic-font="normal" data-semantic-id="3" data-semantic-parent="7" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">1</span></span><span id="MJXc-Node-92" class="mjx-mo" data-semantic-type="punctuation" data-semantic-role="comma" data-semantic-id="4" data-semantic-parent="7" data-semantic-operator="punctuated" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="margin-top: -0.163em; padding-bottom: 0.556em;">,</span></span><span id="MJXc-Node-93" class="mjx-mi MJXc-space1" data-semantic-type="identifier" data-semantic-role="unknown" data-semantic-font="normal" data-semantic-id="5" data-semantic-parent="7" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.169em; padding-bottom: 0.335em;">∞</span></span></span><span id="MJXc-Node-94" class="mjx-mo" data-semantic-type="fence" data-semantic-role="close" data-semantic-id="6" data-semantic-parent="8" data-semantic-operator="fenced" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">)</span></span></span></span></span></span></span></span><script type="math/tex" id="MathJax-Element-20">V \in (1,\infty)</script></span><span>, or</span></ins></li>
<li><ins><code>-1.</code><span> if </span><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-21-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-95" class="mjx-math"><span id="MJX-Collapse-4" class="mjx-maction" data-semantic-complexity="2" style="cursor: pointer;"><span id="MJXc-Node-97" class="mjx-mrow" data-semantic-complexity="22" data-semantic-content="1" data-semantic-children="0,12" data-semantic-id="13" data-semantic-role="unknown" data-semantic-type="infixop"><span id="MJXc-Node-98" class="mjx-mrow"><span id="MJXc-Node-99" class="mjx-mi" data-semantic-type="identifier" data-semantic-role="latinletter" data-semantic-font="italic" data-semantic-id="0" data-semantic-parent="13" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.445em; padding-bottom: 0.279em; padding-right: 0.186em;">V</span></span><span id="MJXc-Node-100" class="mjx-mo MJXc-space3" data-semantic-type="operator" data-semantic-role="unknown" data-semantic-id="1" data-semantic-parent="13" data-semantic-operator="infixop,∈" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.279em; padding-bottom: 0.39em;">∈</span></span><span id="MJXc-Node-101" class="mjx-mrow MJXc-space3" data-semantic-type="fenced" data-semantic-role="leftright" data-semantic-id="12" data-semantic-children="11" data-semantic-content="2,8" data-semantic-parent="13" data-semantic-complexity="17"><span id="MJXc-Node-102" class="mjx-mo" data-semantic-type="fence" data-semantic-role="open" data-semantic-id="2" data-semantic-parent="12" data-semantic-operator="fenced" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">(</span></span><span id="MJXc-Node-103" class="mjx-mrow" data-semantic-type="punctuated" data-semantic-role="sequence" data-semantic-id="11" data-semantic-children="9,5,10" data-semantic-content="5" data-semantic-parent="12" data-semantic-complexity="12"><span id="MJXc-Node-104" class="mjx-mrow" data-semantic-type="prefixop" data-semantic-role="negative" data-semantic-id="9" data-semantic-children="4" data-semantic-content="3" data-semantic-parent="11" data-semantic-complexity="4"><span id="MJXc-Node-105" class="mjx-mo" data-semantic-type="operator" data-semantic-role="subtraction" data-semantic-id="3" data-semantic-parent="9" data-semantic-operator="prefixop,−" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.279em; padding-bottom: 0.445em;">−</span></span><span id="MJXc-Node-106" class="mjx-mi" data-semantic-type="identifier" data-semantic-role="unknown" data-semantic-font="normal" data-semantic-id="4" data-semantic-parent="9" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.169em; padding-bottom: 0.335em;">∞</span></span></span><span id="MJXc-Node-107" class="mjx-mo" data-semantic-type="punctuation" data-semantic-role="comma" data-semantic-id="5" data-semantic-parent="11" data-semantic-operator="punctuated" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="margin-top: -0.163em; padding-bottom: 0.556em;">,</span></span><span id="MJXc-Node-108" class="mjx-mrow MJXc-space1" data-semantic-type="prefixop" data-semantic-role="negative" data-semantic-id="10" data-semantic-children="7" data-semantic-content="6" data-semantic-parent="11" data-semantic-complexity="4"><span id="MJXc-Node-109" class="mjx-mo" data-semantic-type="operator" data-semantic-role="subtraction" data-semantic-id="6" data-semantic-parent="10" data-semantic-operator="prefixop,−" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.279em; padding-bottom: 0.445em;">−</span></span><span id="MJXc-Node-110" class="mjx-mn" data-semantic-type="number" data-semantic-role="integer" data-semantic-font="normal" data-semantic-id="7" data-semantic-parent="10" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.39em; padding-bottom: 0.335em;">1</span></span></span></span><span id="MJXc-Node-111" class="mjx-mo" data-semantic-type="fence" data-semantic-role="close" data-semantic-id="8" data-semantic-parent="12" data-semantic-operator="fenced" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.445em; padding-bottom: 0.611em;">)</span></span></span></span></span></span></span></span><script type="math/tex" id="MathJax-Element-21">V \in (-\infty,-1)</script></span><span>.</span></ins></li>
</ul>
<p><s><span>In any case,</span></s><ins><span>Otherwise,</span></ins><span> the resulting </span><code>value</code><span> is one of at most two floating-point values closest to </span><s><span>the value of the string matching the pattern</span></s><ins><span class="mathjax"><span class="MathJax_Preview" style="color: inherit;"></span><span id="MathJax-Element-22-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" style="font-size: 113%;"><span id="MJXc-Node-112" class="mjx-math" data-semantic-complexity="1"><span id="MJXc-Node-113" class="mjx-mrow"><span id="MJXc-Node-114" class="mjx-mi" data-semantic-type="identifier" data-semantic-role="latinletter" data-semantic-font="italic" data-semantic-id="0" data-semantic-complexity="1"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.445em; padding-bottom: 0.279em; padding-right: 0.186em;">V</span></span></span></span></span><script type="math/tex" id="MathJax-Element-22">V</script></span></ins><span>.</span></p>
</blockquote><h3 id="Feature-test-macro" data-id="Feature-test-macro"><a class="anchor hidden-xs" href="#Feature-test-macro" title="Feature-test-macro"><span class="octicon octicon-link"></span></a><span>Feature test macro</span></h3><p><span>Update values in </span><a href="https://eel.is/c++draft/version.syn" target="_blank" rel="noopener"><span>[version.syn]</span></a><span>, header </span><code>&lt;version&gt;</code><span> synopsis:</span></p><div class="alert alert-warning">
<p><em><span>[Drafting note:</span></em>
<code>from_chars</code><span> has no individual feature testing macro.</span>
<em><span>–end note]</span></em></p>
</div><pre>#define __cpp_lib_to_chars         <s>201611L</s><ins>20XXXXL</ins> <i>// also in &lt;charconv&gt;</i>
</pre><h2 id="References" data-id="References"><a class="anchor hidden-xs" href="#References" title="References"><span class="octicon octicon-link"></span></a><span>References</span></h2><hr class="footnotes-sep"><section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p><span>P0067R5 </span><em><span>Elementary string conversions, revision 5.</span></em>
<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0067r5.html" target="_blank" rel="noopener"><span>https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0067r5.html</span></a> <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p><span>LWG 3081 </span><em><span>Floating point from_chars API does not distinguish between overflow and underflow.</span></em>
<a href="https://cplusplus.github.io/LWG/issue3081" target="_blank" rel="noopener"><span>https://cplusplus.github.io/LWG/issue3081</span></a> <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section></div>
    <div class="ui-toc dropup unselectable hidden-print" style="display:none;">
        <div class="pull-right dropdown">
            <a id="tocLabel" class="ui-toc-label btn btn-default" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false" title="Table of content">
                <i class="fa fa-bars"></i>
            </a>
            <ul id="ui-toc" class="ui-toc-dropdown dropdown-menu" aria-labelledby="tocLabel">
                <div class="toc"><ul class="nav">
<li><a href="#Floating-point-overflow-and-underflow-in-from_chars-LWG-3081" title="Floating-point overflow and underflow in from_chars (LWG 3081)">Floating-point overflow and underflow in from_chars (LWG 3081)</a><ul class="nav">
<li><a href="#Motivation" title="Motivation">Motivation</a></li>
<li><a href="#Background" title="Background">Background</a></li>
<li><a href="#Technical-Decisions" title="Technical Decisions">Technical Decisions</a></li>
<li><a href="#Implementation" title="Implementation">Implementation</a></li>
<li><a href="#Wording" title="Wording">Wording</a><ul class="nav">
<li><a href="#Feature-test-macro" title="Feature test macro">Feature test macro</a></li>
</ul>
</li>
<li><a href="#References" title="References">References</a></li>
</ul>
</li>
</ul>
</div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div>
            </ul>
        </div>
    </div>
    <div id="ui-toc-affix" class="ui-affix-toc ui-toc-dropdown unselectable hidden-print" data-spy="affix" style="top:17px;display:none;" null null>
        <div class="toc"><ul class="nav">
<li class=""><a href="#Floating-point-overflow-and-underflow-in-from_chars-LWG-3081" title="Floating-point overflow and underflow in from_chars (LWG 3081)">Floating-point overflow and underflow in from_chars (LWG 3081)</a><ul class="nav">
<li class=""><a href="#Motivation" title="Motivation">Motivation</a></li>
<li class=""><a href="#Background" title="Background">Background</a></li>
<li class=""><a href="#Technical-Decisions" title="Technical Decisions">Technical Decisions</a></li>
<li class=""><a href="#Implementation" title="Implementation">Implementation</a></li>
<li class=""><a href="#Wording" title="Wording">Wording</a><ul class="nav">
<li><a href="#Feature-test-macro" title="Feature test macro">Feature test macro</a></li>
</ul>
</li>
<li class=""><a href="#References" title="References">References</a></li>
</ul>
</li>
</ul>
</div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous" defer></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
    <script>
        var markdown = $(".markdown-body");
        //smooth all hash trigger scrolling
        function smoothHashScroll() {
            var hashElements = $("a[href^='#']").toArray();
            for (var i = 0; i < hashElements.length; i++) {
                var element = hashElements[i];
                var $element = $(element);
                var hash = element.hash;
                if (hash) {
                    $element.on('click', function (e) {
                        // store hash
                        var hash = this.hash;
                        if ($(hash).length <= 0) return;
                        // prevent default anchor click behavior
                        e.preventDefault();
                        // animate
                        $('body, html').stop(true, true).animate({
                            scrollTop: $(hash).offset().top
                        }, 100, "linear", function () {
                            // when done, add hash to url
                            // (default click behaviour)
                            window.location.hash = hash;
                        });
                    });
                }
            }
        }

        smoothHashScroll();
        var toc = $('.ui-toc');
        var tocAffix = $('.ui-affix-toc');
        var tocDropdown = $('.ui-toc-dropdown');
        //toc
        tocDropdown.click(function (e) {
            e.stopPropagation();
        });

        var enoughForAffixToc = true;

        function generateScrollspy() {
            $(document.body).scrollspy({
                target: ''
            });
            $(document.body).scrollspy('refresh');
            if (enoughForAffixToc) {
                toc.hide();
                tocAffix.show();
            } else {
                tocAffix.hide();
                toc.show();
            }
            $(document.body).scroll();
        }

        function windowResize() {
            //toc right
            var paddingRight = parseFloat(markdown.css('padding-right'));
            var right = ($(window).width() - (markdown.offset().left + markdown.outerWidth() - paddingRight));
            toc.css('right', right + 'px');
            //affix toc left
            var newbool;
            var rightMargin = (markdown.parent().outerWidth() - markdown.outerWidth()) / 2;
            //for ipad or wider device
            if (rightMargin >= 133) {
                newbool = true;
                var affixLeftMargin = (tocAffix.outerWidth() - tocAffix.width()) / 2;
                var left = markdown.offset().left + markdown.outerWidth() - affixLeftMargin;
                tocAffix.css('left', left + 'px');
            } else {
                newbool = false;
            }
            if (newbool != enoughForAffixToc) {
                enoughForAffixToc = newbool;
                generateScrollspy();
            }
        }
        $(window).resize(function () {
            windowResize();
        });
        $(document).ready(function () {
            windowResize();
            generateScrollspy();
        });

        //remove hash
        function removeHash() {
            window.location.hash = '';
        }

        var backtotop = $('.back-to-top');
        var gotobottom = $('.go-to-bottom');

        backtotop.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            if (scrollToTop)
                scrollToTop();
            removeHash();
        });
        gotobottom.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            if (scrollToBottom)
                scrollToBottom();
            removeHash();
        });

        var toggle = $('.expand-toggle');
        var tocExpand = false;

        checkExpandToggle();
        toggle.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            tocExpand = !tocExpand;
            checkExpandToggle();
        })

        function checkExpandToggle () {
            var toc = $('.ui-toc-dropdown .toc');
            var toggle = $('.expand-toggle');
            if (!tocExpand) {
                toc.removeClass('expand');
                toggle.text('Expand all');
            } else {
                toc.addClass('expand');
                toggle.text('Collapse all');
            }
        }

        function scrollToTop() {
            $('body, html').stop(true, true).animate({
                scrollTop: 0
            }, 100, "linear");
        }

        function scrollToBottom() {
            $('body, html').stop(true, true).animate({
                scrollTop: $(document.body)[0].scrollHeight
            }, 100, "linear");
        }
    </script>
</body>

</html>
