lisp/ob-C.el: replace %f with %s to prevent unneeded rounding

* lisp/ob-C.el (org-babel-C-val-to-C-type): Floats should be printed
as string literals to prevent rounding introduced by %f format.

* testing/lisp/test-ob-C.el (ob-C/float-var): Test that floats are not
rounded when passed as an org :var.
This commit is contained in:
Leo Butler 2023-06-01 13:39:13 -05:00 committed by Ihor Radchenko
parent 8037aab493
commit c50b03d99e
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
2 changed files with 12 additions and 1 deletions

View File

@ -339,7 +339,7 @@ FORMAT can be either a format string or a function which is called with VAL."
(type
(pcase basetype
(`integerp '("int" "%d"))
(`floatp '("double" "%f"))
(`floatp '("double" "%s")) ;; %f rounds, use %s to print the float literally
(`stringp
(list
(if (eq org-babel-c-variant 'd) "string" "const char*")

View File

@ -95,6 +95,17 @@
(org-babel-next-src-block 10)
(should (= 42 (org-babel-execute-src-block))))))
(ert-deftest ob-C/float-var ()
"Test that floats are passed without unnecessary rounding."
(if (executable-find org-babel-C++-compiler)
(org-test-with-temp-text
"#+source: float_var
#+begin_src cpp :var x=1.123456789012345678 :includes \"<iostream>\" :results silent
double y = 1.123456789012345678;
std::cout << (x == y);
#+end_src"
(should (= 1 (org-babel-execute-src-block))))))
(ert-deftest ob-C/table ()
"Test of a table output"
(if (executable-find org-babel-C++-compiler)