C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[23909] Re:[수학질문]2를 밑으로 하는 logN = x 일때, x를 구하는 방법 알고 계신분 있으신지...
오랑캐꽃 [oranke] 5389 읽음    2013-04-30 17:20
제가 질문을 제대로 이해한것인지... 그러니까

1 -> 0
2 -> 1
4 -> 2
8 -> 3
16 -> 4
32 -> 5

로 만들어주는 함수를 알고 싶으시다는 건가요?
그렇다면 올리신 질문에 이미 답이 나와있는것으로 보입니다만...

math 유니트 안에 2를 밑수로 하는 로그함수인 log2() 가 있습니다.

procedure TMainForm.Button4Click(Sender: TObject);
var
  i, n: Integer;
begin
  n := 1;
  for i:= 1 to 10 do
  begin
    WriteLn(Format('%d -> %.2f', [n, log2(n)]));
    n := n shl 1;
  end;
end;





저도 산수는 워낙 잼병이라... 원하시는 답변이 되었으면 하네요.


박정모 님이 쓰신 글 :
: .
: 인자로 받는 값은 1, 2, 4, 8, 16, 32, 64 ... 와 같이 2의 x 승의 값 입니다.
: 이 값을 배열의 Index로 사용해야 하는데 배열의 Index는 0..x 입니다.
:
: 인자값 = 1 -> Index = 0
: 인자값 = 2 -> Index = 1
: 인자값 = 4 -> Index = 2
: 인자값 = 8 -> Index = 3
: 인자값 = 16 -> Index = 4
: 인자값 = 32 -> Index = 5
: .
: .
: .
: 와 같이 2의 x승인 인자값을 0..x 으로 변환해줘야할 필요가 있습니다.
:
: for loop를 돌리거나, 몇개의 if... else if...를 반복해서 써주면 되기야 하는데
: 그것 보다는 한줄(또는 두세개줄)의 수식으로 처리하는게 더 심플할 것 같습니다.
:
: 몇시간 동안 생각해보고 인터넷도 검색해봐도 답이 없군요.
: 수년전(6-7년전)에도 같은 질문을 올렸던(봤던?) 기억이 납니다만, 그 때는 if...
: else...로 처리하고 말았죠.
:
: 2를 밑으로 하는 logN = x 일때, x를 구하는 심플한 수식을 찾고있습니다.
: for loop, if... else if...를 사용하지 않는 방법이어야 합니다.
:
: 수학적 지식이 깊으시거나, 이 문제의 답을 아시면 조언 좀 부탁 드립니다.
: 감사합니다.
: .
오랑캐꽃 [oranke]   2013-04-30 17:28 X
엥? 올리고나니 자게란이네~~
에이 뭐 박지훈님이 알아서 옮겨주시겠지...
신성기 [barmi]   2013-04-30 17:35 X
엇, 저도 댓글 달고 보니 oranke님께서 답글 달아 주셨네요.
델파이에는 2를 밑으로 한는 log함수가 있다는 것을 첨 알았습니다.
감사합니다.
박정모 [primitic]   2013-04-30 17:41 X
1. 저는 LogN, Log2 함수가 있는지 몰랐습니다.(혹은, 잊어 버리고 있었거나)
   math 유닛을 열어봐야 하는데 저의 귀차니즘이 몰고온 재난을 어찌 수습해야 할지... 파아~~

2. 실제로 저는 이 질문을 쓰면서 <외부함수 사절> & <사칙연산으로 제한> 이라는 조건을
   쓰려다 잊어 버렸습니다. 이 조건에 맞게 문제를 풀려고 몇시간 동안 끙끙거리고 있는것
   같습니다. 사칙연산이 아니라도 적어도 복잡한 수학기호가 등장하지 않는 해법을 원했던
   겁니다.

3. Log2() 함수를 열었더니 FYL2X라는 어셈블리 명령어를 사용하는데, 이 명령어는 Log2를
   계산해주는 x87 명령어 이더군요. 사칙연산(또는 복잡한 수학기호를 제외한 연산) 만으로
   이 문제를 풀 수 있었다면 x87에 FYL2X가 등장하지 않았으리라 추측해봅니다.

4. 자유게시판에 이 질문을 올린것은 델파이, 씨빌더 관련 질문이 아니고, 수학적 해법을
   원하는 질문이었기 때문입니다.
   게시판 관리자가 자유게시판에 어울리지 않는 질문과 답이라면 적절한 장소로 옮겨 주시리라
   기대해 봅니다.

5. 도와 주셔서 감사합니다.
오랑캐꽃 [oranke]   2013-04-30 18:17 X
log2를 쓰지 않고도...
입력값은 2의 승수로 제한된다, 그리고 말씀하신 X값이 0~32 또는 0~64 이내의 값이라는 정의만 있다면...
그냥 1로 설정된 비트가 처음으로 나타나는 위치를 찾으면 됩니다.

.... 0000 0000 (0) -> 아무데도 나타나지 않으니 0
.... 0000 0001 (1) -> 첫번째 나타나니 1
.... 0000 0010 (2) -> 두번째 나타나니 2
.... 0000 0100 (4) -> 세번째 나타나니 3
.... 0000 1000 (8) -> 네번째 나타나니 4

델파이 코드로 만들어보면...

function CheckBitStep(n: Integer): Integer;
begin
  Result := 0;
  n := n shr 1;
  while n <> 0 do
  begin
    Inc(Result);
    n := n shr 1;
  end;
end;

procedure TMainForm.Button5Click(Sender: TObject);
var
  i, n: Integer;
begin
  n := 1;
  for i:= 1 to 10 do
  begin
    WriteLn(Format('%d -> %d', [n, CheckBitStep(n)]));
    n := n shl 1;
  end;
end;


그런데... 요새 수치연산 프로세서 없는 기계는 찾아보기 힘드니... 저건 그냥 뻘짓.
log2 가 더 빨라요~
박정모 [primitic]   2013-04-30 18:21 X
루프, 루프,,, 루프 사절이라고... ^^;;
저는 좀 더 생각 해봐야 할것 같습니다.
Nibble [gameover]   2013-05-01 21:18 X
2의 31승 까지라면 BSR 명령을 쓰면 됩니다. 한 번의 연산으로 끝나죠. 그 이상의 값일땐 BSR 을 합성하면 됩니다.
오랑캐꽃 [oranke]   2013-05-02 14:25 X
Nibble 님 감사합니다. 완존 깔끔하네요... ^^;;

function CheckBitStep(n: LongWord): Integer;
asm
    BSR EAX, EAX
end;
Lyn [tohnokanna]   2013-05-10 13:10 X
3 // 로그는 사칙연산으로 구할 수 있습니다.

애초에 사칙연산으로 불가능한 계산은 컴퓨터로 할 수 없습니다.
로그의 성질상 x를 밑으로 하는 y의 로그는 ln(y) / ln(x) 로 구할 수 있고
ln(x) 는 테일러 급수를 이용해 전개하면 단순한 분수의 덧셈으로 바꿀 수 있습니다.

FYL2X같은 명령어를 지원하는건 자주 쓰는거니까 미리 만들어두자~ 정도의 의미입니다.
CALL도 push, jmp 명령어로 바꿀 수 있는것 처럼요...

아이비 브릿지에선 아예 랜덤구하는 명령어까지 추가됬는데요 뭐 =_=a

+ -

관련 글 리스트
23908 [수학질문]2를 밑으로 하는 logN = x 일때, x를 구하는 방법 알고 계신분 있으신지... 박정모 4905 2013/04/30
23909     Re:[수학질문]2를 밑으로 하는 logN = x 일때, x를 구하는 방법 알고 계신분 있으신지... 오랑캐꽃 5389 2013/04/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.