부동소수 & 고정소수

Java 2024. 10. 21. 19:21

부동소수점 연산과 이진수 표현

부동소수점의 본질을 이해하기 위해서, 십진수와 이진수의 차이를 먼저 살펴볼 필요가 있다. 우리가 일상에서 사용하는 십진수는 10개의 숫자(0-9)를 사용하는데 반해, 컴퓨터는 이진수 시스템,  0과 1을 사용한다.

십진수와 이진수

십진수에서 소수를 표현하는 것은 매우 자연스럽게 이루어진다. 예를 들어, 0.5는 5 x 10^(-1)로 쉽게 표현할  있다. 하지만 이진수에서는 모든 숫자를 2의 거듭제곱 형태로 표현해야 한다. 예를 들어, 0.5는 이진수로 0.1로 표현된다. 이는 (1 x 2^(-1))와 같다.

소수 0.1의 이진수 표현

문제는 0.1 같은 소수를 이진수로 표현할  발생한다. 십진수 0.1은 (1 x 10^(-1))로 표현되지만, 이진수에서는 정확하게 표현할  없다. 이는 0.1이 이진수로 0.0001100110011... 처럼 무한히 반복되기 때문이다.  과정에서 무한히 반복되는 숫자를 잘라내서 근사치로 저장하게 되고,  때문에 작은 오차가 생긴다.

부동소수점 연산의 오차

부동소수점 연산에서 발생하는 오차의 원인은 이진수와 십진수 간의 표현 방식의 차이 때문이다. 이런 작은 오차들이 연산 과정에서 쌓여서 정확한 결과를 얻기 어렵게 만드는 것이다. 이러한 개념을  깊이 이해하려면, 부동소수점 표준인 IEEE 754에 대해 공부해보는 것도 도움이 된다.

고정소수점과 부동소수점

고정소수점 연산은 부동소수점 연산보다 정확도가 높다. 예를 들어, 100으로 나누면 소수점 아래 자리 수가 줄어들면서 정밀도가 낮아지지만, 이진수로 표현할  오차가 적어져서 연산 결과가  정확하게 나온다. 그래서 100으로 나눈  연산하면 부동소수점 오차를 피하고 보다 안정적인 결과를 얻을  있다.

올림  이진수로 저장되는 과정

부동소수점을 올림했을  부동소수가 되는 이유는  값이 정수로 끝나지 않기 때문이다. 예를 들어, 0.1을 올림하면 1이 되지만, 부동소수점 연산에서는 0.1을 이진수로 정확하게 표현하지 못해. 그래서 이진수로 변환하면 작은 오차가 생긴다.  오차가 쌓이면 연산 결과에서 예상치 못한 소수가 나타날  있다. 따라서 부동소수점을 올림했을 때도  값이 이진수로 저장될  미세한 오차가 남아 있으면 부동소수가 되는 것이다.

 

 

 

참고 자료

부동소수점 연산과 관련하여  깊이 이해하기 위한 참고 자료는 다음과 같다:

반응형

'Java' 카테고리의 다른 글

apt로 설치한 docker update하기  (0) 2023.06.27
jsp page 접근시 session 생성  (0) 2023.04.11
nginx 502 error,  (0) 2023.02.14
string dateformat validation yyyy-mm-dd  (0) 2022.11.24
restapi @dateformat  (1) 2022.11.24
블로그 이미지

visualp

c#, java

,

How to upgrade Jenkins on Ubuntu

 

upgrade a Jenkins on the Ubuntu

First, update the apt packages to fetch the latest versions

sudo apt-get update

Use the following commands to upgrade Jenkins:

sudo apt-get --only-upgrade install jenkins

And then restart the Jenkins server using the command

sudo systemctl restart jenkins

 

 

반응형

'Java' 카테고리의 다른 글

부동소수 & 고정소수  (1) 2024.10.21
jsp page 접근시 session 생성  (0) 2023.04.11
nginx 502 error,  (0) 2023.02.14
string dateformat validation yyyy-mm-dd  (0) 2022.11.24
restapi @dateformat  (1) 2022.11.24
블로그 이미지

visualp

c#, java

,

jsp 를 뷰로 사용한다면 다음과 같은 일이 발생할 수 있습니다.

session을 생성하지 않았지만.. jsp로 forwared 하는경우 즉 jsp 페이지를 어떠한 방법으로든 호출하는 경우

session이 자동으로 생성됩니다.

jsp 선언시 session=false로 설정해주세요.

<%@ page contentType="text/html;charset=UTF-8" language="java"  session="false" %>

그럼 session에 담긴 로그인 정보는 spring을 사용한다면 model에 담거나..

servlet/jsp를 사용한다면 request.setAttribute 형태로 담아서 사용하시면 되니다.

 

session=false 처리를 하지 않는다면.... session이 생성될 텐데.. 로그인 체크를 위해서는

1. session is null 인지 체크 하기 

2. session.getAttribute("user") is null 체크하기 

형태로 로직을 구현해야 합니다. 

반응형

'Java' 카테고리의 다른 글

부동소수 & 고정소수  (1) 2024.10.21
apt로 설치한 docker update하기  (0) 2023.06.27
nginx 502 error,  (0) 2023.02.14
string dateformat validation yyyy-mm-dd  (0) 2022.11.24
restapi @dateformat  (1) 2022.11.24
블로그 이미지

visualp

c#, java

,

nginx 502 error,

Java 2023. 2. 14. 12:57

Nginx Error:

upstream prematurely closed connection while reading response header from upstream

upstream prematurely closed connection while reading response header from upstream

 

    server {
        listen 80;
        location / {
            proxy_pass http://proxy_service;
            proxy_http_version 1.1;  // upstream 보낼 때 http 1.1로 ... 
            proxy_connect_timeout 5;
.....
        }

 

http 1.0

http 1.1

http 2.0

관련해서는 mdn 참조

https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP

반응형

'Java' 카테고리의 다른 글

apt로 설치한 docker update하기  (0) 2023.06.27
jsp page 접근시 session 생성  (0) 2023.04.11
string dateformat validation yyyy-mm-dd  (0) 2022.11.24
restapi @dateformat  (1) 2022.11.24
tomcat8 cookie 관련  (0) 2022.05.06
블로그 이미지

visualp

c#, java

,

javax.validation을 이용해서 date형태의 날짜를 validation을 할 때 정규표현식을 이용할 수 있음

날짜가 문자열일 때 ( yyyy-mm-dd)

@Pattern(regexp ="^\\d{4}\\-(0[1-9]|1[012])\\-(0[1-9]|[12][0-9]|3[01])$",message = "eventDt는 yyyy-mm-dd 형식:2022=10-09과 일치해야 합니다.")
private String eventDt;

\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])*

 

등을 이용해서 검증할 수 있음.

 

반응형

'Java' 카테고리의 다른 글

jsp page 접근시 session 생성  (0) 2023.04.11
nginx 502 error,  (0) 2023.02.14
restapi @dateformat  (1) 2022.11.24
tomcat8 cookie 관련  (0) 2022.05.06
lombok mapstruct 설정  (0) 2021.12.15
블로그 이미지

visualp

c#, java

,

restapi @dateformat

Java 2022. 11. 24. 14:41

timestamp값을 아래와 같이 사용하려면 .

{
  "statusCode": 404,
  "timestamp": "2022-11-24T14:32:53.553594",
  "message": "이벤트가 존재하지 않습니다."
}

 

1.해당 변수에 @DateTimeFormat annotation을 달고 직접 pattern을 설정합니다.

public class ErrorMessage {
    private int statusCode;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime timestamp;
    private String message;

    public ErrorMessage(int statusCode, String message) {
        this.statusCode = statusCode;
        this.timestamp = LocalDateTime.now();
        this.message = message;
    }

    public int getStatusCode() {
        return statusCode;
    }

    public LocalDateTime getTimestamp() {
        return timestamp;
    }

    public String getMessage() {
        return message;
    }
}

2.application.properties에 jackson  serialization중 WRITE_DATES_AS_TIMESTAMPS 값을 false로  설정합니다.  

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false

기본 format 형태로 출력됩니다. 전체적으로 날짜 포멧이 아래와 같다면... .. 2번 방법으로.. 사용...

yyyy-MM-dd'T'HH:mm:ss
반응형
블로그 이미지

visualp

c#, java

,

tomcat8 cookie 관련

Java 2022. 5. 6. 14:48

java.lang.IllegalArgumentException: An invalid domain [.xxxx.com] was specified for this cookie
과 같이 서브도메인 쿠키 생성시 아래와 같이 처리 해줘야 함.

tomcat context.xml에 다음과 같이 추가
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor"/>

spring boot embead 일경우
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
    return container -> {
        if (container instanceof TomcatEmbeddedServletContainerFactory) {
            TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
            tomcat.addContextCustomizers(context -> context.setCookieProcessor(new LegacyCookieProcessor()));
        }
    };
}

반응형
블로그 이미지

visualp

c#, java

,

lombok mapstruct 설정

Java 2021. 12. 15. 11:04

mapstruct + lombok 같이 사용하기 위해서는 

<dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.4.2.Final</version>
</dependency>

 <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
 </dependency>
        
        

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source> <!-- depending on your project -->
                    <target>11</target> <!-- depending on your project -->

                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.4.2.Final</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.22</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok-mapstruct-binding</artifactId>
                            <version>0.2.0</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>

lombok-mapstruct-binding 설정을 해줘야 한다.

반응형
블로그 이미지

visualp

c#, java

,