컴퓨터 내부적인 정수, 실수 의 사칙연산 원리에 대한 정보

ssehoony의 이미지

정수는 어떻게 더하고 빼고 곱하고 나누는지 기계적(비트연산) 알고리즘있을텐데 거기에 대한 자세한 자료 없나요?
정수 뿐만아니라 실수도요.
덧셈이야 사실 우리가 더하는 것 처럼 carry 플래그 하나 두고 더해가면 되겠지만, 곱셈은 어떻게 하는거죠? 우리가 하듯 그렇게 단순 무식하게 하나요?
게다가 정수는 그렇다 치고 실수는요? 실수는 덧셈만 따져도 굉장히 복잡할 것 같은데 그걸 어떻게 하드웨어 적으로 구현을 한건지 알고리즘이 나와있는 곳이 있나요?
IEEE 754 같은건 부동소수를 어떻게 표기하는 건지는 나와있는데 그걸 어떻게 사칙 연산하면 좋은지에 대한 정보가 없네요.
그정보를 구하고 싶습니다.

elien의 이미지

논리회로에 대한 책이나 자료들, 혹은 논문을 살펴보시는 것이 큰 도움이 될 듯 합니다.
상용 CPU 같은 데에서 어떤 알고리듬을 채택하고 있는지 모르겠습니다만,
교과서에 나오는 수준의 adder 만도 Carry Save Adder, Carry Lookahead Adder 등의 여러가지가 있습니다.
carry 플래그를 두고 Full Adder 등을 cascading 시켜서 multi-bit adder 를 만드는 것은 실제로는 propagation delay 가 너무 커서 사용하지 않습니다.
곱셈기의 경우에도 마찬가지로 엄청나게 다양한 알고리듬이 존재합니다.
당연히 'adder 를 이용하여 n 번 더한다' 는 식의 것은 사용하지 않을 것이구요, 가장 기억에 남는 곱셈 방식으로는 radix-{4,8} booth 알고리듬이 있네요.
매우 간단히 설명하자면; 이것은 승수(乘數)를 여러 비트씩 윈도우로 묶어, 그에 따라 피승수를 complement 혹은 shifting 시킨 다음 그것들을 sign bit에 따라 더하여 곱셈 결과를 구하는 방식입니다.
부동소수에 대해서도 정수 덧/곱셈에 대한 자료들을 찾으면 딸려 나올 것 같습니다. 잘은 모르겠지만 유효숫자와 지수의 조합으로 계산을 하게될테니, 곱셈/나눗셈은 정수보다 더 쉬울 수도 있지 않을까요 :o

훗, 못 믿겠나?

asiawide의 이미지

citeseer 나 구글에서 multiplier 로 찾아보시면 엄청나게 많은 구현 알고리즘이 나올 것입니다. 저전력과 뭐 이런저런 특수한 경우들에 대해서 곱셈기는 아직까지도 계속 나오는 것 같습니다. 대학교라면 도서관에서 IEEE 구독한다면 IEEE Transactions on VLSI 같은 저널을 봐도 종종 나옵니다. VLSI 관련 교과서로 기본적인 알고리즘을 보고 저널 같은 곳에 나온 자세한 사항을 보면 도움이 될것 같습니다.

ssehoony의 이미지

아항
그럼 결국 IEEE 754 와 같은 표기법에만 표준을 두었고, 연산 알고리즘에 대해서는 제각각 이다는 거군요.

음 그렇다면 부동소수 곱셈의 경우 하드웨어에 따라 결과가 달라 질 수가 있는건가요? 어떤 제한된 오차 범위라는게 있겠지만, 하튼 아주 조금의 오차라도...

아직은 절대적으로 좋다고 하는 알고리즘이 없나 보군요.
하튼 답변해주신 내용 참고해서 좀 더 공부해 봐야겠네요.
답변 감사합니다~

lifthrasiir의 이미지

ssehoony wrote:
아항
그럼 결국 IEEE 754 와 같은 표기법에만 표준을 두었고, 연산 알고리즘에 대해서는 제각각 이다는 거군요.

음 그렇다면 부동소수 곱셈의 경우 하드웨어에 따라 결과가 달라 질 수가 있는건가요? 어떤 제한된 오차 범위라는게 있겠지만, 하튼 아주 조금의 오차라도...

아직은 절대적으로 좋다고 하는 알고리즘이 없나 보군요.
하튼 답변해주신 내용 참고해서 좀 더 공부해 봐야겠네요.
답변 감사합니다~

네. 하드웨어에 따라 오차가 존재할 수 있습니다. 사용자가 직접 설정할 수 있는 세팅... 예를 들어서 절삭 방법의 경우 towards +infinity, towards -infinity, ...등등도 있지만, 아키텍처의 특성 때문에 발생하는 오차도 있습니다. 예를 들어서 64비트 부동 소숫점을 사용하지만 FPU가 내부적으로 80비트로 표현해서 계산해서 생기는 오차 같은 게 있었던 걸로 기억합니다. (kldp에서 본 것 같은데 어디 있는 지 모르겠네요.)

- 토끼군

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.