Skip to content

YlmzCmlttn

Cemalettin Yılmaz Blog

Menu
  • Home
  • About Me
  • Projects
    • Iot-AR
    • Magnifi-AR
    • Smarthome-IOS
    • Others
  • Categories
    • Articles
    • Augmented Reality
    • Capture The Flag
      • Google CTF
        • 2018
    • Embedded Systems
    • IoT
    • Logisim
    • My Essays
    • Nvidia Jetson
      • Jetson TX1
    • Operating Systems
      • Kali
      • Raspbian
      • Ubuntu
    • Personal
    • Programming
      • Arduino
      • C
      • C#
      • Css
      • Html
      • Js
      • Matlab
      • Node.js
      • Python
      • Swift
      • VHDL
    • Projects
      • Embedded Systems
      • Electric
      • IoT
      • IoT-AR
      • Logisim
      • Magnifi-AR
      • Pose Estimation
    • Raspberry Pi
    • Xilinx
    • Others
Menu

atof stof stod problems with local floating point separator in C/C++

Posted on May 7, 2021 by Yılmaz Cemalettin

Today I encounter a problem with my C++ code. I try to convert string to double. Then I realize in my computer std::atof doesn’t work properly. Also others(stof stod) doesn’t not work correctly.

Then I decide to find the issue. I write to simple script to print all output of those functions.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//
#include <iostream>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    std::string num = "3.5";
    std::cout<<num<<std::endl;
 
    double ret = std::atof(num.c_str());
    std::cout<<ret<<std::endl;
    std::cout<<ret+0.1<<std::endl;
 
    ret = std::stof(num);
    std::cout<<ret<<std::endl;
    std::cout<<ret+0.1<<std::endl;
 
    ret = std::stod(num);
    std::cout<<ret<<std::endl;
    std::cout<<ret+0.1<<std::endl;
    
    return 0;
 
}

Outputs:

1
2
3
4
5
6
7
8
//
3.5
3
3.1
3
3.1
3
3.1

Outputs don’t correct. But all three functions return double. So it is not relating to casting.

While I am trying to give different input. I just try 3,5 instead of 3.5 as a string. Then it works. Because currently, I am in Turkey. The local floating point separator is a comma in Turkey. But when I print double values in std::cout, It prints with dot. So these function use local seperator but printing functions don’t use it. So I try to find, how I can set local settings without changing anything in OS. So I found locale.h header.

This header provides functions that you can set local settings like date, currency symbol, etc.

you can change entire locale setting with using setlocale function.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//
#include <iostream>
#include <stdlib.h>
#include <locale.h>
int main(int argc, char *argv[])
{    
    setlocale (LC_ALL,"en_US.utf8");
 
    std::string num = "3.5";
    std::cout<<num<<std::endl;
 
    double ret = std::atof(num.c_str());
    std::cout<<ret<<std::endl;
    std::cout<<ret+0.1<<std::endl;
 
    ret = std::stof(num);
    std::cout<<ret<<std::endl;
    std::cout<<ret+0.1<<std::endl;
 
    ret = std::stod(num);
    std::cout<<ret<<std::endl;
    std::cout<<ret+0.1<<std::endl;
 
    return 0;
}

Outputs:

1
2
3
4
5
6
7
8
//
3.5
3.5
3.6
3.5
3.6
3.5
3.6

 

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

My Motto

“Learn to share, Share to learn”

LinkedIn Badge

Cemalettin Yılmaz

Ads

Archives

Categories

  • Articles (1)
  • Augmented Reality (3)
  • Capture The Flag (23)
    • Google CTF (22)
      • 2018 (13)
      • 2019 (9)
    • PicoCTF (1)
      • 2019 (1)
  • Embedded Systems (3)
  • IoT (3)
  • Logisim (1)
  • My Essays (3)
  • Nvidia Jetson (5)
    • Xavier (5)
  • Operating Systems (24)
    • Kali (3)
    • Raspbian (2)
    • Ubuntu (21)
  • Others (1)
  • Personal (1)
  • Programming (44)
    • Arduino (4)
    • C (10)
    • C# (4)
    • C++ (5)
    • Css (1)
    • CUDA (6)
    • Html (1)
    • Js (2)
    • Libraries (5)
      • OpenCV (3)
      • OpenGL (2)
    • Matlab (14)
    • Node.js (5)
    • Python (6)
    • Swift (3)
  • Programs (4)
    • Tools (4)
  • Projects (21)
    • Books Solutions (8)
    • Electric (2)
    • Embedded Systems (2)
    • Energy Harvesting (1)
    • IoT (2)
    • IoT-AR (1)
    • Logisim (1)
    • Magnifi-AR (3)
    • Pose Estimation (3)
    • Smarthome-Ios (1)
  • Raspberry Pi (3)
  • Uncategorized (2)
  • YZlib (1)

Recent Posts

  • atof stof stod problems with local floating point separator in C/C++
  • Pico CTF 2019 Answers
  • YZlib: Personal C++ Library
  • Drive to target | Google CTF 2019
  • FriendSpaceBookPlusAllAccessRedPremium | Google CTF 2019

Recent Comments

  • AbaShelha on Ghidra Installation on Ubuntu |18.04, 16.04, 14.04
  • Peter on Ghidra Installation on Ubuntu |18.04, 16.04, 14.04
  • Yılmaz Cemalettin on Ghidra Installation on Ubuntu |18.04, 16.04, 14.04
  • Yılmaz Cemalettin on 16-Bit CPU on Logisim
  • Jenny on 16-Bit CPU on Logisim
  • MOON on 16-Bit CPU on Logisim
  • anti on Ghidra Installation on Ubuntu |18.04, 16.04, 14.04
  • hunkerjr on STOP GAN | Google CTF 2019
  • Shaq on 16-Bit CPU on Logisim
  • NURUL AFIQAH MOHD HASBULLAH on 16-Bit CPU on Logisim

Linkedln

© 2022 YlmzCmlttn | Powered by Superbs Personal Blog theme